chenfengyijiu

wukong-robot--TTS和ASR

前言

​ 这个实际上就是调用百度的提供AipSpeech,这个接口库。

语音合成:

​ 就是将文字上传,接口返回的是语音文件,将语音文件保存在本地

语音识别:

​ 上传一段60S以内的语音文件,返回语音内的内容

下面是示例代码
这里会有一个问题:
语音识别:报错
{\'err_msg\': \'request pv too much\', \'err_no\': 3305, \'sn\': \'399602018291622379966\'}
目前查看有两种情况:1、修改dev_id为1537.2、账号没有相关的额度

from aip import AipSpeech
from abc import ABCMeta, abstractmethod
import wave
from pydub import AudioSegment
APP_ID = \'15422825\'
APP_KEY = \'DhXGtWHYMujMVZZGRI3a7rzb\'
SECRET_KEY = \'PbyUvTL31fImGthOOIP5ZbbtEOGwGOoT\'

class AbstractTTS(object):
    """
    Generic parent class for all TTS engines
    """

    __metaclass__ = ABCMeta

    @classmethod
    def get_config(cls):
        return {}

    @classmethod
    def get_instance(cls):
        profile = cls.get_config()
        instance = cls(**profile)
        return instance

    @abstractmethod
    def get_speech(self, phrase):
        pass

class BaiduTTS(AbstractTTS):
    """
    使用百度语音合成技术
    要使用本模块, 首先到 yuyin.baidu.com 注册一个开发者账号,
    之后创建一个新应用, 然后在应用管理的"查看key"中获得 API Key 和 Secret Key
    填入 config.yml 中.
    ...
        baidu_yuyin:
            appid: \'9670645\'
            api_key: \'qg4haN8b2bGvFtCbBGqhrmZy\'
            secret_key: \'585d4eccb50d306c401d7df138bb02e7\'
            dev_pid: 1936
            per: 1
            lan: \'zh\'
        ...
    """

    SLUG = "baidu-tts"

    def __init__(self, appid, api_key, secret_key, per=1, lan=\'zh\', **args):
        super(self.__class__, self).__init__()
        self.client = AipSpeech(appid, api_key, secret_key)
        self.per, self.lan = str(per), lan

    @classmethod
    def get_config(cls):
        # Try to get baidu_yuyin config from config
        pass
        #return config.get(\'baidu_yuyin\', {})

    def get_speech(self, phrase):
        result  = self.client.synthesis(phrase, self.lan, 1, {\'per\': self.per});
        # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
        if not isinstance(result, dict):
            with open(\'audio.mp3\',\'wb\') as f:
                f.write(result)
            #tmpfile = utils.write_temp_file(result, \'.mp3\')
            print(\'{} 语音合成成功,合成路径:{}\')
            #return tmpfile
        else:
            print(\'{} 合成失败!\'.format(self.SLUG), exc_info=True)


class BaiduASR():
    """
    百度的语音识别API.
    dev_pid:
        - 1936: 普通话远场
        - 1536:普通话(支持简单的英文识别)
        - 1537:普通话(纯中文识别)
        - 1737:英语
        - 1637:粤语
        - 1837:四川话
    要使用本模块, 首先到 yuyin.baidu.com 注册一个开发者账号,
    之后创建一个新应用, 然后在应用管理的"查看key"中获得 API Key 和 Secret Key
    填入 config.xml 中.
    ...
        baidu_yuyin:
            appid: \'9670645\'
            api_key: \'qg4haN8b2bGvFtCbBGqhrmZy\'
            secret_key: \'585d4eccb50d306c401d7df138bb02e7\'
        ...
    """

    SLUG = "baidu-asr"

    def __init__(self, appid, api_key, secret_key, dev_pid=1936, **args):
        super(self.__class__, self).__init__()
        self.client = AipSpeech(appid, api_key, secret_key)
        self.dev_pid = 1537

    @classmethod
    def get_config(cls):
        # Try to get baidu_yuyin config from config
        pass

    def transcribe(self, wav_path):
        # 识别本地文件
        print(\'dev_pid:{}\',self.dev_pid)
        wav = wave.open(wav_path, \'rb\')
        pcm = wav.readframes(wav.getnframes())
        res = self.client.asr(pcm, \'pcm\', 16000, {
            \'dev_pid\': self.dev_pid,
        })
        print(res)
        if res[\'err_no\'] == 0:
            print(\'{} 语音识别到了:{}\'.format(self.SLUG, res[\'result\']))
            return \'\'.join(res[\'result\'])
        else:

            print(\'{} 语音识别出错了: {}\'.format(self.SLUG, res[\'err_msg\']))
            return \'\'

if __name__ == \'__main__\':
    BaiduTTS =BaiduTTS(appid="24226351",api_key=\'V0rrRk2k95ytnsOTV8ZCqtX7\',secret_key=\'bxuKH3eFu50akaKgYYuEYvR1aOhQgqUK\')
    BaiduTTS.get_speech(phrase = "今天是个好额日子")
    song = AudioSegment.from_mp3("audio.mp3")
    song.export("audio.wav", format="wav")
    BaiduASR =BaiduASR(appid=APP_ID,api_key=APP_KEY,secret_key=SECRET_KEY)
    BaiduASR.transcribe(wav_path = "audio.wav")
\'\'\'

# 与百度进行一次加密校验,认证你是合法用户合法的应用
# AipSpeech是百度语音的客户端,认证成功之后,客户端将被开启,这里的client就是已经开启的百度语音的客户端了
client = AipSpeech(APP_ID,APP_KEY,SECRET_KEY)
str = \'今天天气怎么样?\'
result = client.synthesis(
    str,  # text:合成的文本,使用UTF-8编码,请注意文本长度必须小于1024字节
    \'zh\',           # lang:语言,中文:zh,英文:en
    1,              # ctp:客户端信息这里就写1,写别的不好使,至于为什么咱们以后再解释
    {
        \'vol\':5,    # 合成音频文件的准音量
        \'spd\':4,    # 语速取值0-9,默认为5中语速
        \'pit\':8,    # 语调音量,取值0-9,默认为5中语调
        \'per\':4     # 发音人选择,0为女声,1为男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女
    } # options:这是一个dict类型的参数,里面的键值对才是关键.
)
# 如果上面的三个参数APP_ID,APP_KEY,SECRET_KEY填写正确的话
# result就是音频文件的二进制文件流,如果返回失败的话,result就会是个字典
print(result)

if not isinstance(result,dict):
    with open(\'audio.mp3\',\'wb\') as f:
        f.write(result)


# 识别正确返回语音二进制文件流,错误则返回dict,参照下面错误代码.
"""
result = {
            \'err_detail\': \'Tex length exceeds limit.\',
            \'err_msg\': \'parameter error.\',
            \'err_no\': 501,
            \'err_subcode\': 10,
            \'tts_logid\': 3257246120
        }
"""
\'\'\'

分类:

技术点:

相关文章:

  • 2021-11-09
  • 2021-07-30
  • 2021-05-13
  • 2021-11-13
  • 2021-11-23
  • 2021-11-02
  • 2021-11-04
  • 2021-05-28
猜你喜欢
  • 2021-11-05
  • 2021-05-02
  • 2021-11-04
  • 2021-04-22
  • 2021-11-13
  • 2021-11-10
  • 2021-11-04
相关资源
相似解决方案