zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    UltraEdit的配置
    字符编码笔记:ASCII,Unicode和UTF-8
    Hello World Hexo
    好久不见,味素
    记一次springboot+dubbo+zookeeper吐血的问题
    [深度学习]模型部署之优化
    [深度学习]pytorch部署之onnx
    count(*)、count(1)、count(column)
    like %和-的区别与使用
    SQL语言分类
  • 原文地址:https://www.cnblogs.com/demo-deng/p/8359062.html
Copyright © 2011-2022 走看看