76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
|
|
import asyncio
|
|||
|
|
from http import HTTPStatus
|
|||
|
|
from dashscope.audio.asr import Recognition
|
|||
|
|
import dashscope
|
|||
|
|
import logging
|
|||
|
|
from Config import Config
|
|||
|
|
|
|||
|
|
# 初始化日志记录器
|
|||
|
|
logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
# 若没有配置环境变量,请用百炼API Key将下行替换为:dashscope.api_key = "sk-xxx"
|
|||
|
|
dashscope.api_key = Config.ALY_LLM_API_KEY
|
|||
|
|
|
|||
|
|
class ASRClient:
|
|||
|
|
"""
|
|||
|
|
阿里云语音识别客户端,用于处理语音文件的转写任务
|
|||
|
|
使用 Recognition API 支持本地文件实时转写
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
def __init__(self, api_key=None):
|
|||
|
|
"""
|
|||
|
|
初始化ASR客户端
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
api_key: 阿里云DashScope API密钥,若不提供则使用配置文件中的密钥
|
|||
|
|
"""
|
|||
|
|
logger.info("开始初始化ASR客户端")
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
self.api_key = api_key or Config.ALY_LLM_API_KEY
|
|||
|
|
dashscope.api_key = self.api_key
|
|||
|
|
logger.info("ASR客户端初始化完成")
|
|||
|
|
except Exception as e:
|
|||
|
|
logger.error(f"初始化ASR客户端失败: {str(e)}", exc_info=True)
|
|||
|
|
raise
|
|||
|
|
|
|||
|
|
async def transcribe_file(self, file_path):
|
|||
|
|
"""
|
|||
|
|
转写本地音频文件
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
file_path: 本地音频文件路径
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
str: 转写后的文本,如果失败返回None
|
|||
|
|
"""
|
|||
|
|
logger.info(f"开始转写文件: {file_path}")
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
recognition = Recognition(
|
|||
|
|
model='paraformer-realtime-v1',
|
|||
|
|
format='mp3',
|
|||
|
|
sample_rate=16000,
|
|||
|
|
callback=None
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# Run blocking call in executor
|
|||
|
|
loop = asyncio.get_running_loop()
|
|||
|
|
result = await loop.run_in_executor(None, lambda: recognition.call(file_path))
|
|||
|
|
|
|||
|
|
if result.status_code == HTTPStatus.OK:
|
|||
|
|
sentences = []
|
|||
|
|
if 'sentence' in result.output:
|
|||
|
|
for s in result.output['sentence']:
|
|||
|
|
sentences.append(s['text'])
|
|||
|
|
text = "".join(sentences)
|
|||
|
|
logger.info("转写成功")
|
|||
|
|
return text
|
|||
|
|
else:
|
|||
|
|
logger.error(f"转写失败: {result.code} - {result.message}")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
logger.error(f"转写过程出错: {str(e)}", exc_info=True)
|
|||
|
|
return None
|