61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
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 '语音转换失败'
|