from aip import AipSpeech from fastapi import APIRouter from starlette.websockets import WebSocket from app.constants.asr import APP_ID, API_KEY, SECRET_KEY asr_client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) router = APIRouter() @router.websocket("/asr") async def chat2(websocket: WebSocket): # 等待websocket接收数据 await websocket.accept() temp_buffer = bytes() # 在此处与百度建立websocket连接 while True: # 等待websocket接收文本数据 receive_data = await websocket.receive() buffer = receive_data.get("bytes") text = receive_data.get("text") if text == "录音完成": asr_text = await asr_buffer(temp_buffer) await websocket.send_text(asr_text) temp_buffer = bytes() else: if buffer: # 使用websocket API 无须再进行数据的合并,每次拿到数据之后,直接将内容发送给百度的websocket连接即可 temp_buffer += buffer # 读取文件 def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() # 识别本地文件 async def asr_file(filePath): result = await asr_client.asr(get_file_content(filePath), 'pcm', 16000, { 'dev_pid': 1537, }) if result.get('err_msg') == 'success.': return result.get('result')[0] else: return '语音转换失败' # 识别语音流 # async的意思是定义异步函数,当使用await修饰异步函数并执行时,如果该异步函数耗时比较长 # python会自动挂起异步函数,让其他代码运行,等到异步函数完成之后,再回头调用函数 async def asr_buffer(buffer_data): result = asr_client.asr(buffer_data, 'pcm', 16000, { 'dev_pid': 1537, }) if result.get('err_msg') == 'success.': return result.get('result')[0] else: return '语音转换失败'