前言:这是我几个月前一边工作,一边捣鼓的个人项目,一直没有时间去写点总结,也许是我这个人比较懒吧,不然也不会做出这种东西,哈哈哈。记得那时闲来无事,自己又有许多奇思异想,由于自己之前使用itchat做了个可以接管微信的聊天机器人,我就想能不能给自己的机器人加一些个人技能,如能自己说话,能听懂我说话,简单来说需求就是需要加个语音识别和文字识别的功能。

1.根据方向找思路

说干就干,我就想如何能够实现这些功能呢?本来自己是想自己利用MongoDB自己建造一个比较大的语料库,把客户的输入作为问题,然后自己设定不同的回答,然后客户进入对话后就可以通过语料库来搜索响应的回答。后来我就把它推翻了,因为需要的语料库很大,自己又没有特别优秀的机器学习算法(其实就是自己写不来机器学习的算法),因此体验并不理想。要想实现语音识别,首先需要一个媒介,能够懂我们的汉语,那图灵的机器人就特别合适,不论你说什么,它都有似乎不太一样的回答(实际上有些方面还有些不足),我就默认它很优秀吧,毕竟人工智能的发展是需要一定时间的积累的,现在的图灵在行业中也算是比较优秀。

2.根据思路找捷径

在实现语音识别的路上,基础的问题已经解决,那后来的问题的解决才是关键,我首先想到的是搜索python的库,python拥有的就不要重复造轮子了,一是需要大量的时间,二是开发成本太大。所以就想能不用别人的AI平台来做这件事情,于是我就搜了下BAT还有科大讯飞的AI平台,好像只有Baidu的平台才提供免费的语音识别服务,然后就开始干活了。另外附上百度AI开发文档的地址,想了解自己去看,里面清清楚楚写着语音识别需要的条件,如果有什么看不懂的再问我。这是百度AI技术文档的开发资料地址

3.根据要求写功能

我使用的是python语言开发的,所以我直接看的python的api文档资料。
根据百度RESET API文档可知,要想实现语音识别需要把语音文件以pcm的格式发送到百度的平台上,当然还要在本地安装百度的直接pip install baidu-aip到python的环境中。使用itchat下载了好友发来的语音文件发现是MP3格式的文件,这就比较麻烦了,因为百度语音识别的默认格式是pcm。
由于底层识别使用的是pcm,因此推荐直接上传pcm文件。如果上传其它格式,会在服务器端转码成pcm,调用接口的耗时会增加。

语音识别仅支持以下格式 :pcm(不压缩)、wav(不压缩,pcm编码)、amr(有损压缩格式);8k/16k 采样率 16bit 位深的单声道。即:

1.pcm wav amr 格式三选一。 正常情况请使用pcm。其中wav格式需要使用pcm编码。
2.采用率二选一 8000 或者 16000。正常情况请使用16000
单声道
百度文档也提供了转码的工具,可是太推荐的工具是ffmpeg,好吧下载安装吧,需要去ffmpeg官网下载安装包,然后把它安装到python环境的scripits目录下。

4.开始音频转码

音频转码的话,之前做的工作还不足够,还需要安装python的第三方ffmpeg的api接口库,我用的是ffmpy3,然后去找python官网上的pypi文档

def mp3_change_pcm(mp3_path):
    ff = FFmpeg(
        inputs={mp3_path: None},
        outputs={
            './static/Recording/target.pcm':'-acodec pcm_s16le -f s16le -ac 1 -ar 16000'
        }
    )
    ff.run()

这就是文件转码的方式。

5.开始语音识别和文字识别

然后去百度AI平台,去开通一个账号,上面文档写的也很清楚而且还需要安装一个aip的第三方模块,这里怕你们迷路再次附上地址吧里面写的很清楚,不懂的请留言,直白的说就是把转码后的语音文件上传到百度的平台上,然后它会给你返回一个字典,里面有转码后的字符串。这里再附上部分我写的源代码

# 文字转语音
def get_recording(msg):
    APP_ID = '14433967'
    API_KEY = 'agF3ohtSRGGaZPOlCcpyBQ90'
    SECRET_KEY = 'FCCb7l5bGvwGgsU7i8xT8xBT6KUF2L9m'

    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

    result = client.synthesis(msg, 'zh', 1, {'vol': 5, 'per': 4, 'pit':9})

    # 识别正确返回语音二进制 错误则返回dict
    if not isinstance(result, dict):
        with open('./static/Recording/auido.mp3', 'wb') as f:
            f.write(result)
    record_path = './static/Recording/auido.mp3'
    return record_path


def mp3_change_pcm(mp3_path):
    ff = FFmpeg(
        inputs={mp3_path: None},
        outputs={
            './static/Recording/target.pcm':'-acodec pcm_s16le -f s16le -ac 1 -ar 16000'
        }
    )
    ff.run()

# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

def voice_recongnition(pcm_file):
    APP_ID = '14433967'
    API_KEY = 'agF3ohtSRGGaZPOlCcpyBQ90'
    SECRET_KEY = 'FCCb7l5bGvwGgsU7i8xT8xBT6KUF2L9m'
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    # 识别本地文件
    results = client.asr(get_file_content(pcm_file), 'pcm', 16000, {
        'dev_pid': 1536,
    })
    print(results)
    return results['result']

# 语音识别启动函数
def voice_recon_run():
    path = os.listdir('./')
    for x in path:
        if re.findall(r'mp3$', x):
            mp3_path = '.\\'+ x
            mp3_change_pcm(mp3_path)
            voice_recon_text = voice_recongnition(r'.\static\Recording\target.pcm')
            os.remove(mp3_path)
            os.remove(r'.\static\Recording\target.pcm')
            return voice_recon_text

你的好友或者是你自己给你发语音,然后程序会MP3文件利用ffmpeg转码为pcm格式并且符合百度标准的文件,百度把它翻译成文字,然后你的程序接收到返回的文字,再把文字发给图灵机器人,它在给你返回要说的文字,然后在把这段文字发给百度AI,它在帮你转为一个MP3格式的语音文件,你再把它发给你的微信好友。这个语音识别,然后再发出根据语境的语音的回路就打通了。

6.语音模式和文字模式的切换

当然用户有选择的权利,他有权利要求你发语音或文字,所以你要贴合实际场景来定制你的机器人,我使用的方法是定义一个全局变量,然后用户会跟我说语音模式或文字模式的命令,然后我的程序会判断这个全局变量,进而判断要不要转为语音,这会大大的提高用户的体验,整个设计的逼格也更符合人性化。

# 文字模式和语音模式的切换
def judge_method(num, tr, fromuser):
    if num == 1:
        itchat.send_msg(tr, fromuser)
    elif num == 2:
        record_path = get_recording(tr)
        itchat.send_file(record_path, fromuser)

7.总结

这个项目的话,我想的挺多,也是我一个人写的项目,不算什么大项目吧,但自我觉得很有新意,也很贴合生活实际。这个项目目前我已上传到githup上,整体的思想就是如上,如果需要源代码请移步到我的githup账号下载aiphare源文件里面有好几个版本功能最全面的是最老的那个版本,可以分析好友分布,还可以帮你下载图片,还可以查天气预报,等等等等,功能太多了,这里就不一一列举。前面的几个版本也都能运行,不过功能会少一点,功能少一点安装的依赖包也少一点,所有根据个人需要自由选择吧。如果在使用时遇到什么困难,可以在本帖下留言,或者在我githup下留言,我会一一回复,另外我也只是学习python刚一年多的人,做的不好的地方请多指教,再此提前谢过,好吧,就说那么多废话吧。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐