Python 百度语音识别与合成REST API及ffmpeg使用

操作系统:Windows 
Python:3.5 
欢迎加入学习交流QQ群:657341423


百度语音识别官方文档 
百度语音合成官方文档

注意事项:接口支持 POST 和 GET两种方式,个人支持用post模式,因为get的话,如果get数据太长,会出现缺失的。 
语音识别要求支持的语音格式 
原始 PCM 的录音参数必须符合 8k/16k 采样率、16bit 位深、单声道,支持的压缩格式有:pcm(不压缩)、wav、opus、amr、x-flac。 
简单说,语音参数必需要 8k/16k 采样率、16bit 位深、单声道,不然会出现内容和文字不相符的情况。


网上这类教程基本上都是Python urllib2实现的,这里我使用requests实现。

import requests
import json
import base64
import wave
from pydub import AudioSegment ###需要安装pydub、ffmpeg import io class BaiduRest: def __init__(self, cu_id, api_key, api_secert): # token认证的url self.token_url = "https://openapi.baidu.com/oauth/2.0/token" # 语音合成的resturl self.getvoice_url = "http://tsn.baidu.com/text2audio" # 语音识别的resturl self.upvoice_url = 'http://vop.baidu.com/server_api' self.cu_id = cu_id self.getToken(api_key, api_secert) return def getToken(self, api_key, api_secert): # 1.获取token data={'grant_type':'client_credentials','client_id':api_key,'client_secret':api_secert} r=requests.post(self.token_url,data=data) Token=json.loads(r.text) self.token_str = Token['access_token'] def getVoice(self, text, filename): # 2. 向Rest接口提交数据 data={'tex':text,'lan':'zh','cuid':self.cu_id,'ctp':1,'tok':self.token_str} r=requests.post(self.getvoice_url,data=data,stream=True) voice_fp = open(filename,'wb') voice_fp.write(r.raw.read()) # for chunk in r.iter_content(chunk_size=1024): # voice_fp.write(chunk) voice_fp.close() def getText(self, filename): # 2. 向Rest接口提交数据 data = {"format":"wav","rate":16000, "channel":1,"token":self.token_str,"cuid":self.cu_id,"lan":"zh"} # 语音的一些参数 wav_fp = open(filename,'rb') voice_data = wav_fp.read() data['len'] = len(voice_data) data['speech'] = base64.b64encode(voice_data).decode('utf-8') post_data = json.dumps(data) r=requests.post(self.upvoice_url,data=bytes(post_data,encoding="utf-8")) # 3.处理返回数据 return r.text def ConvertToWav(self,filename,wavfilename): #先从本地获取mp3的bytestring作为数据样本 fp=open("out.mp3",'rb') data=fp.read() fp.close() #主要部分 aud=io.BytesIO(data) sound=AudioSegment.from_file(aud,format='mp3') raw_data = sound._data #写入到文件,验证结果是否正确。 l=len(raw_data) f=wave.open(wavfilename,'wb') f.setnchannels(1) f.setsampwidth(2) f.setframerate(16000) f.setnframes(l) f.writeframes(raw_data) f.close() return wavfilename if __name__ == "__main__": #api_key和api_secert 自行编写 api_key = "" api_secert = "" # 初始化 bdr = BaiduRest("test_python", api_key, api_secert) # 将字符串语音合成并保存为out.mp3 bdr.getVoice("问题,作为开发人员,你的职责是什么,答按照工作进度和编程工作规范编写系统中的关键模块,设计编写详细设计,配合测试员修改相应的程序,提供软件的后期技术支持,进行编码实现,代码走查,单元测试,产品交付,", "out.mp3") # 识别test.wav语音内容并显示 print(bdr.getText(bdr.ConvertToWav("out.mp3","test.wav")))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

运行结果:

这里写图片描述


设计思想:这里先将语音合成,生成MP3格式,然后将这段语音转换wav格式。然后再去语音识别。 
在实际开发中,可以通过录音,得到一段音频文件,然后再转换wav格式。再去识别即可。 
这里涉及到pydub 的安装。直接pip install pydub安装即可。 
ffmpeg安装可以参考:ffmpeg安装 
ffmpeg下载一定是static 
这里写图片描述


总结:基本上都是调用百度的api接口就完成语音的识别和合成,但是值得注意的语音识别的要求和条件,就算得到wav格式,建议都转换一下格式。不然识别上会与内容不同。

 

原文地址:http://blog.csdn.net/HuangZhang_123/article/details/72819145

转载于:https://www.cnblogs.com/demo-deng/p/8359062.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值