当前位置:   article > 正文

python调用讯飞语音合成API接口实现文字转语音,然后转换音频格式_python pcm转mp3

python pcm转mp3

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

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

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

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

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

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

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

五、根据开发者文档的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='你的APPID', APISecret='你的APISecret',
  120. APIKey='你的APIKey',
  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. def pcm2wav(pcm_file, wav_file, channels=1, bits=16, sample_rate=16000):
  3. # 打开 PCM 文件
  4. pcmf = open(pcm_file, 'rb')
  5. pcmdata = pcmf.read()
  6. pcmf.close()
  7. # 打开将要写入的 WAVE 文件
  8. wavfile = wave.open(wav_file, 'wb')
  9. # 设置声道数
  10. wavfile.setnchannels(channels)
  11. # 设置采样位宽
  12. wavfile.setsampwidth(bits // 8)
  13. # 设置采样率
  14. wavfile.setframerate(sample_rate)
  15. # 写入 data 部分
  16. wavfile.writeframes(pcmdata)
  17. wavfile.close()
  18. if __name__=="__main__":
  19. pcm2wav("demo.pcm", "demo.wav")

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

注意,安装pydub之前需要下载ffmpeg,并将其bin目录添加到环境变量,重启编辑器。

ffmpeg官方网站:FFmpeg,下载速度慢,可用我分享的老版本。

链接:https://pan.baidu.com/s/1c-ZpFVcTG9v1ubVSjXcaJQ 
提取码:llmm

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

八、大家有补充请评论区留言,谢谢!

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

闽ICP备14008679号