65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
"""
|
||
ASR 服务:语音转文字
|
||
"""
|
||
import base64
|
||
import os
|
||
|
||
from openai import OpenAI
|
||
|
||
|
||
class ASRService:
|
||
"""ASR 服务(语音转文字)"""
|
||
|
||
def __init__(self):
|
||
api_key = os.getenv("OPENAI_API_KEY", "")
|
||
if api_key:
|
||
self.client = OpenAI(api_key=api_key)
|
||
else:
|
||
self.client = None
|
||
|
||
async def transcribe(self, audio_base64: str) -> str | None:
|
||
"""
|
||
转写音频为文字
|
||
|
||
Args:
|
||
audio_base64: Base64 编码的音频数据
|
||
|
||
Returns:
|
||
转写文本
|
||
"""
|
||
if not self.client:
|
||
# 如果没有配置 API Key,返回模拟数据
|
||
return "这是模拟的转写文本(请配置 OPENAI_API_KEY 以使用实际 ASR 功能)"
|
||
|
||
try:
|
||
# 解码 Base64 音频
|
||
audio_bytes = base64.b64decode(audio_base64)
|
||
|
||
# 保存临时文件
|
||
import tempfile
|
||
with tempfile.NamedTemporaryFile(suffix=".m4a", delete=False) as tmp_file:
|
||
tmp_file.write(audio_bytes)
|
||
tmp_file_path = tmp_file.name
|
||
|
||
try:
|
||
# 调用 OpenAI Whisper API
|
||
with open(tmp_file_path, "rb") as audio_file:
|
||
transcript = self.client.audio.transcriptions.create(
|
||
model="whisper-1",
|
||
file=audio_file,
|
||
language="zh" # 中文
|
||
)
|
||
return transcript.text
|
||
finally:
|
||
# 清理临时文件
|
||
import os
|
||
if os.path.exists(tmp_file_path):
|
||
os.remove(tmp_file_path)
|
||
except Exception as e:
|
||
# 出错时返回错误信息
|
||
return f"转写失败: {str(e)}"
|
||
|
||
|
||
# 全局实例
|
||
asr_service = ASRService()
|