61 lines
2.5 KiB
Python
61 lines
2.5 KiB
Python
import asyncio
|
||
import logging
|
||
from typing import Any, Dict
|
||
|
||
from langchain_core.runnables import RunnableLambda
|
||
|
||
from app.asr.asr_client import asr_client
|
||
from app.core.log import logger
|
||
|
||
|
||
class ASRService:
|
||
def __init__(self):
|
||
self._recognize_chain = RunnableLambda(self._recognize_handler)
|
||
self._recognize_file_chain = RunnableLambda(self._recognize_file_handler)
|
||
self._recognize_url_chain = RunnableLambda(self._recognize_url_handler)
|
||
|
||
async def _recognize_handler(self, input_data: Dict[str, Any], **kwargs) -> str:
|
||
audio_data = input_data.get("audio_data")
|
||
format = input_data.get("format", "wav")
|
||
logger.info(f"开始语音识别,数据长度: {len(audio_data) if audio_data else 0}")
|
||
result = await asr_client.recognize(audio_data, format)
|
||
logger.info(f"语音识别完成,结果长度: {len(result)}")
|
||
return result
|
||
|
||
async def _recognize_file_handler(self, input_data: Dict[str, Any], **kwargs) -> str:
|
||
file_path = input_data.get("file_path")
|
||
logger.info(f"开始语音识别,文件路径: {file_path}")
|
||
result = await asr_client.recognize_from_file(file_path)
|
||
logger.info(f"语音识别完成,结果长度: {len(result)}")
|
||
return result
|
||
|
||
async def _recognize_url_handler(self, input_data: Dict[str, Any], **kwargs) -> str:
|
||
audio_url = input_data.get("audio_url")
|
||
logger.info(f"开始语音识别,URL: {audio_url}")
|
||
result = await asr_client.recognize_from_url_direct(audio_url)
|
||
logger.info(f"语音识别完成,结果长度: {len(result)}")
|
||
return result
|
||
|
||
async def recognize(self, audio_data: bytes, format: str = "wav") -> str:
|
||
return await self._recognize_chain.ainvoke({"audio_data": audio_data, "format": format})
|
||
|
||
async def recognize_from_file(self, file_path: str) -> str:
|
||
return await self._recognize_file_chain.ainvoke({"file_path": file_path})
|
||
|
||
async def recognize_from_url(self, audio_url: str) -> str:
|
||
return await self._recognize_url_chain.ainvoke({"audio_url": audio_url})
|
||
|
||
async def close(self):
|
||
await asr_client.close()
|
||
|
||
|
||
asr_service = ASRService()
|
||
|
||
if __name__ == "__main__":
|
||
async def test():
|
||
# 测试用户的音频URL
|
||
audio_url = "https://meedu-cos.9artedu.com/archive/media/10780491256375083103_1782355020252_external.amr"
|
||
print(f"测试音频URL: {audio_url}")
|
||
result = await asr_service.recognize_from_url(audio_url)
|
||
print(f"识别结果: {result}")
|
||
asyncio.run(test()) |