cozeTTS.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # -*- coding: utf-8 -*-
  2. from ..builder import TTSEngines
  3. from ..engineBase import BaseTTSEngine
  4. import base64
  5. from digitalHuman.protocol import *
  6. from digitalHuman.utils import logger, httpxAsyncClient, checkResponse
  7. __all__ = ["CozeApiTts"]
  8. @TTSEngines.register("Coze")
  9. class CozeApiTts(BaseTTSEngine):
  10. def setup(self):
  11. self.url = "https://api.coze.cn/v1/audio/speech"
  12. # TODO: 多人请求差异化
  13. # self.voicesMap = {}
  14. # async def voices(self, **kwargs) -> List[VoiceDesc]:
  15. # # 参数校验
  16. # paramters = self.checkParameter(**kwargs)
  17. # API_TOKEN = paramters["token"]
  18. # if not API_TOKEN: return []
  19. # headers = {
  20. # 'Authorization': f'Bearer {API_TOKEN}',
  21. # 'Content-Type': 'application/json'
  22. # }
  23. # resp = []
  24. # page_num = 1
  25. # page_size = 100
  26. # while True:
  27. # payload = {
  28. # "page_num": page_num,
  29. # "page_size": page_size
  30. # }
  31. # response = await httpxAsyncClient.get("https://api.coze.cn/v1/audio/voices", headers=headers, params=payload)
  32. # result = checkResponse(response, "CozeApiTts", "get voice list")
  33. # has_more = result['data']['has_more']
  34. # voices = result['data']['voice_list']
  35. # self.voicesMap.update((voice['name'], voice['voice_id']) for voice in voices)
  36. # for voice in voices:
  37. # resp.append(VoiceDesc(
  38. # name=voice['name'],
  39. # gender=GENDER_TYPE.FEMALE if 'female' in voice['speaker_id'] else GENDER_TYPE.MALE,
  40. # ))
  41. # if has_more:
  42. # page_num += 1
  43. # else:
  44. # break
  45. # return resp
  46. async def run(self, input: TextMessage, **kwargs) -> AudioMessage:
  47. # 参数校验
  48. paramters = self.checkParameter(**kwargs)
  49. token = paramters["token"]
  50. bot_id = paramters["bot_id"]
  51. headers = {
  52. 'Authorization': f'Bearer {token}',
  53. 'Content-Type': 'application/json'
  54. }
  55. # 获取智能体配置信息
  56. response = await httpxAsyncClient.get(f"https://api.coze.cn/v1/bots/{bot_id}", headers=headers)
  57. resp = checkResponse(response, "CozeApiTts", "get bot info")
  58. voice_id = resp['data']['voice_info_list'][0]['voice_id']
  59. payload = {
  60. 'input': input.data,
  61. 'voice_id': voice_id,
  62. 'speed': 1.0,
  63. 'response_format': 'mp3',
  64. 'sample_rate': 16000,
  65. }
  66. logger.debug(f"[TTS] Engine input: {input.data}")
  67. response = await httpxAsyncClient.post(self.url, json=payload, headers=headers)
  68. if response.status_code != 200:
  69. raise RuntimeError(f"CozeAPI tts api error: {response.text}")
  70. message = AudioMessage(
  71. data=base64.b64encode(response.content).decode('utf-8'),
  72. sampleRate=16000,
  73. sampleWidth=2,
  74. )
  75. return message