sales-assistant-py-new/app/asr/asr_service.py

61 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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())