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