当前位置:   article > 正文

Python调用科大讯飞在线语音合成API --内附完整项目_python 科大讯飞tts

python 科大讯飞tts

一,注册讯飞账号,并实名制。

讯飞开放平台-以语音交互为核心的人工智能开放平台 (xfyun.cn)

二、找到音频合成,按页面提示申请免费试用。

在线语音合成_免费试用-讯飞开放平台 (xfyun.cn)

三、申请免费使用后,找到API信息如下:

 四、找到开发者文档,仔细阅读

语音合成(流式版)WebAPI 文档 | 讯飞开放平台文档中心 (xfyun.cn)

这里是直接使用WebAPI的方式进行整合。到这里你可以直接下载他提供的demo代码,然后把上面我们提到的三个参数换成你自己的就可以完成简单的中文语音的合成了,实际上还是挺简单的。当然后面我也会提供给大家我整合好的demo。

 

五、根据开发者文档的python demo代码,加上你的API信息:

  1. # -*- coding:utf-8 -*-
  2. #
  3. # author: iflytek
  4. #
  5. # 本demo测试时运行的环境为:Windows + Python3.7
  6. # 本demo测试成功运行时所安装的第三方库及其版本如下:
  7. # cffi==1.12.3
  8. # gevent==1.4.0
  9. # greenlet==0.4.15
  10. # pycparser==2.19
  11. # six==1.12.0
  12. # websocket==0.2.1
  13. # websocket-client==0.56.0
  14. # 合成小语种需要传输小语种文本、使用小语种发音人vcn、tte=unicode以及修改文本编码方式
  15. # 错误码链接:https://www.xfyun.cn/document/error-code (code返回错误码时必看)
  16. # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  17. import websocket
  18. import datetime
  19. import hashlib
  20. import base64
  21. import hmac
  22. import json
  23. from urllib.parse import urlencode
  24. import time
  25. import ssl
  26. from wsgiref.handlers import format_date_time
  27. from datetime import datetime
  28. from time import mktime
  29. import _thread as thread
  30. import os
  31. STATUS_FIRST_FRAME = 0 # 第一帧的标识
  32. STATUS_CONTINUE_FRAME = 1 # 中间帧标识
  33. STATUS_LAST_FRAME = 2 # 最后一帧的标识
  34. class Ws_Param(object):
  35. # 初始化
  36. def __init__(self, APPID, APIKey, APISecret, Text):
  37. self.APPID = APPID
  38. self.APIKey = APIKey
  39. self.APISecret = APISecret
  40. self.Text = Text
  41. # 公共参数(common)
  42. self.CommonArgs = {"app_id": self.APPID}
  43. # 业务参数(business),更多个性化参数可在官网查看
  44. self.BusinessArgs = {"aue": "raw", "auf": "audio/L16;rate=16000", "vcn": "xiaoyan", "tte": "utf8"}
  45. self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-8')), "UTF8")}
  46. # 使用小语种须使用以下方式,此处的unicode指的是 utf16小端的编码方式,即"UTF-16LE"”
  47. # self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-16')), "UTF8")}
  48. # 生成url
  49. def create_url(self):
  50. url = 'wss://tts-api.xfyun.cn/v2/tts'
  51. # 生成RFC1123格式的时间戳
  52. now = datetime.now()
  53. date = format_date_time(mktime(now.timetuple()))
  54. # 拼接字符串
  55. signature_origin = "host: " + "ws-api.xfyun.cn" + "\n"
  56. signature_origin += "date: " + date + "\n"
  57. signature_origin += "GET " + "/v2/tts " + "HTTP/1.1"
  58. # 进行hmac-sha256进行加密
  59. signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
  60. digestmod=hashlib.sha256).digest()
  61. signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')
  62. authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % (
  63. self.APIKey, "hmac-sha256", "host date request-line", signature_sha)
  64. authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
  65. # 将请求的鉴权参数组合为字典
  66. v = {
  67. "authorization": authorization,
  68. "date": date,
  69. "host": "ws-api.xfyun.cn"
  70. }
  71. # 拼接鉴权参数,生成url
  72. url = url + '?' + urlencode(v)
  73. # print("date: ",date)
  74. # print("v: ",v)
  75. # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
  76. # print('websocket url :', url)
  77. return url
  78. def on_message(ws, message):
  79. try:
  80. message = json.loads(message)
  81. code = message["code"]
  82. sid = message["sid"]
  83. audio = message["data"]["audio"]
  84. audio = base64.b64decode(audio)
  85. status = message["data"]["status"]
  86. print(message)
  87. if status == 2:
  88. print("ws is closed")
  89. ws.close()
  90. if code != 0:
  91. errMsg = message["message"]
  92. print("sid:%s call error:%s code is:%s" % (sid, errMsg, code))
  93. else:
  94. with open('./demo.pcm', 'ab') as f:
  95. f.write(audio)
  96. except Exception as e:
  97. print("receive msg,but parse exception:", e)
  98. # 收到websocket错误的处理
  99. def on_error(ws, error):
  100. print("### error:", error)
  101. # 收到websocket关闭的处理
  102. def on_close(ws):
  103. print("### closed ###")
  104. # 收到websocket连接建立的处理
  105. def on_open(ws):
  106. def run(*args):
  107. d = {"common": wsParam.CommonArgs,
  108. "business": wsParam.BusinessArgs,
  109. "data": wsParam.Data,
  110. }
  111. d = json.dumps(d)
  112. print("------>开始发送文本数据")
  113. ws.send(d)
  114. if os.path.exists('./demo.pcm'):
  115. os.remove('./demo.pcm')
  116. thread.start_new_thread(run, ())
  117. if __name__ == "__main__":
  118. # 测试时候在此处正确填写相关信息即可运行
  119. wsParam = Ws_Param(APPID='7c101e4e', APISecret='ZWZhMzBmYjUwYzY3OTNiYWI4NmQwNmI5',
  120. APIKey='b47e829623df42f4ac625ba5b8fd8618',
  121. Text="随着科技的飞速发展,教育领域也迎来了前所未有的变革。从传统的课堂教学到线上学习平台,再到虚拟现实和人工智能在教育中的应用,我们正处在一个教育模式不断演变的时代。本文将探讨未来教育的一些趋势,以及技术如何与人文相结合,共同塑造一个更加全面和高效的学习环境。")
  122. websocket.enableTrace(False)
  123. wsUrl = wsParam.create_url()
  124. ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close)
  125. ws.on_open = on_open
  126. ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
'
运行


六、官方demo的代码,默认生成的音频是.pcm格式,如果需要转为wav格式请使用如下方法

  1. import wave
  2.  
  3. def pcm2wav(pcm_file, wav_file, channels=1, bits=16, sample_rate=16000):
  4.     # 打开 PCM 文件
  5.     pcmf = open(pcm_file, 'rb')
  6.     pcmdata = pcmf.read()
  7.     pcmf.close()
  8.  
  9.     # 打开将要写入的 WAVE 文件
  10.     wavfile = wave.open(wav_file, 'wb')
  11.     # 设置声道数
  12.     wavfile.setnchannels(channels)
  13.     # 设置采样位宽
  14.     wavfile.setsampwidth(bits // 8)
  15.     # 设置采样率
  16.     wavfile.setframerate(sample_rate)
  17.     # 写入 data 部分
  18.     wavfile.writeframes(pcmdata)
  19.     wavfile.close()
  20.  
  21.  
  22. if __name__=="__main__":
  23.     pcm2wav("demo.pcm", "demo.wav")


七、如果你需要将音频转为mp3格式,请使用如下代码将wav格式转为mp3格式。

  1. from pydub import AudioSegment
  2. song = AudioSegment.from_wav("demo.wav")
  3. song.export("demo.mp3", format="mp3")

完整代码已经上传到CSDN,0积分下载,有需要的朋友自行下载。

Python调用科大讯飞在线语音合成API -完整代码

感谢大家的阅读,觉得有所帮助的朋友点点关注点点赞!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/961871
推荐阅读
相关标签
  

闽ICP备14008679号