speech_server.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import uvicorn
  2. import requests
  3. import os
  4. from fastapi import FastAPI
  5. from funasr import AutoModel
  6. from funasr.utils.postprocess_utils import rich_transcription_postprocess
  7. from pydantic import BaseModel
  8. model = AutoModel(
  9. model="iic/SenseVoiceSmall",
  10. trust_remote_code=True,
  11. remote_code="./model.py",
  12. vad_model="fsmn-vad",
  13. vad_kwargs={"max_single_segment_time": 30000},
  14. device="cuda:0",
  15. )
  16. # 定义asr数据模型,用于接收POST请求中的数据
  17. class ASRItem(BaseModel):
  18. url: str # 输入音频的远程URL
  19. app = FastAPI()
  20. @app.post("/asr")
  21. async def asr(item: ASRItem):
  22. try:
  23. # 下载远程音频文件
  24. response = requests.get(item.url)
  25. if response.status_code != 200:
  26. raise Exception(f"Failed to download audio from {item.url}. Status code: {response.status_code}")
  27. with open("test.wav", "wb") as f:
  28. f.write(response.content)
  29. # 进行语音识别
  30. res = model.generate("test.wav",
  31. language="auto", # "zn", "en", "yue", "ja", "ko", "nospeech"
  32. use_itn=True,
  33. batch_size_s=60,
  34. merge_vad=True, #
  35. merge_length_s=15, )
  36. text = rich_transcription_postprocess(res[0]["text"])
  37. print(text)
  38. result_dict = {"code": 0, "msg": "ok", "res": text}
  39. except Exception as e:
  40. result_dict = {"code": 1, "msg": str(e)}
  41. finally:
  42. # 删除临时下载的文件
  43. if os.path.exists("test.wav"):
  44. os.remove("test.wav")
  45. return result_dict
  46. if __name__ == '__main__':
  47. uvicorn.run(app, host='0.0.0.0', port=2003)