操作系统: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