前言

之前在CSDN上看到有人用python调用语音api接口实现一个语音对话机器人的功能,于是依葫芦画瓢,按照方法用python撸了一个语音对话助手,并成功在一个linux 智能音箱上应用并实现播报效果。现把当时的思路和实现代码梳理一遍,准备在树莓派上在这个代码的基础上拓展一下应用。

1. 准备工作

首先该代码是基于python3 编写,主要是因为如百度、科大讯飞、图灵等各SDK应用商提供了便捷的python api接口,并且对python 的支持非常友好,仅需几行代码即可调用其相关的语音AI功能,比自己写一个语音模块方便太多。所以基础的准备工作主要有以下几点:

  1. python开发环境
    电脑安装python3,并通过pip install 安装需调用的相关模块,如pyaudio、wave、json、urllib等,相关模块的功能自行百度即可;
import os
from os import system
import aip
from aip import AipSpeech
import wave
import requests
import json
  1. 百度api账号
    通过对比百度、科大讯飞和图灵机器人的开发者平台,发现百度提供的api接口可同时满足语音转文字和文字转语音的功能,因此该代码主要是调用百度的api接口,只需要申请百度的开发者账号即可满足我们的需求。
    登陆百度AI开放平台(https://ai.baidu.com/tech/speech),注册账号,阅读技术文档,了解如何在python中调用api。
    创建应用后只需要记住这三个关键字:App ID、API Key、Secret Key,后面调用的时候会用到。
  2. 图灵机器人api账号
    语音识别ASR和文字转语音TTS已经通过百度api实现,图灵开发者平台api主要是提供自然语言理解NLP这个功能。

2. 搭建思路

  1. 需求
    人与机器对话,主要有三个步骤:接收语音–理解意图–进行回答。

    所以,实现机器语音对话的过程就是,通过硬件设备录入语音,语音助手识别语音意图后进行回答。

  2. 实现思路
    说话–设备录音–语音转成文字ASR–文字意图理解NLP–得到回应文字NLP–文字转成语音TTS–设备播放语音–问答结束

3. 开始录音-Recording

不同的硬件设备的录音方式不一样,linux系统的智能音箱,可以通过aplay或arecord命令实现录制音频文件。如果是使用windows电脑运行python程序,则可以通过调用pyaudio库实现本地录音得到音频文件。
linux版本录音命令如下:

system('aplay -C -D hw:0,1 -r 16000 -c 2 -f S16_LE -d 5 --period-size=1024 --buffer-size=8192 /tmp/16k_2ch_16bit.wav')
print('recording_end !')

上述录音命令中,录制音频的采样率为16000Hz,比特数为16bit,通道数为2,格式为wav文件。

4. 语音转文字-ASR

得到wav音频文件后,需要将语音内容转化为文字,这个过程叫语音识别(ASR | Automatic Speech Recognition)。百度开发者平台提供了语音识别的api接口,并支持python调用,只需要通过pip install baidu_aip调用该模块即可。
注意,百度的这个api支持的文件格式有限,文件后缀只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式。

###需要识别的文件AUDIO_FILE = path  # 只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式# 文件格式FORMAT = AUDIO_FILE[-3:];  # 文件后缀只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式

需要值得表扬的是,百度语音识别的api接口支持普通话、英语、粤语、四川话等方言的识别,功能强大。

###wave_to_txt###
APP_ID = '******'
API_KEY = '************'
SECRET_KEY = '**********************'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)def ASR():# 读取录音文件with open('/tmp/mono.wav', 'rb') as fp:voices = fp.read()print('~~wave_read_done!~~')try:# 参数dev_pid:1536普通话(支持简单的英文识别)、1537普通话(纯中文识别)、1737英语、1637粤语、1837四川话、1936普通话远场result = client.asr(voices, 'wav', 16000, {'dev_pid': 1537, })result_text = result["result"][0]print("you said: " + result_text)return result_textexcept KeyError:print("KeyError")

5. 自然语言理解-NLP

得到文字信息后,接下来需要做的就是理解文字信息的意图,并给出正确的回应,类似我们大脑的理解过程,这个过程叫做自然语言处理(NLP|Natural Language Processing)或自然语言理解(NLU|Natural Language Understanding)。
NLP是研究用电子计算机模拟人的语言交际过程,使计算机能理解和运用人类社会的自然语言如汉语、英语等,实现人机之间的自然语言通信,以代替人的部分脑力劳动,包括查询资料、解答问题、摘录文献、汇编资料以及一切有关自然语言信息的加工处理。NLU在文本信息处理处理系统中扮演着非常重要的角色,是推荐、问答、搜索等系统的必备模块。
图灵机器人调用NLP api 代码块如下:

###NLP--TURING Robot ###
turing_api_key = "*************"
api_url = "http://openapi.tuling123.com/openapi/api/v2"  # 图灵机器人api网址
headers = {'Content-Type': 'application/json;charset=UTF-8'}#图灵机器人回复
def Turing(text_words):req = {"reqType": 0,"perception": {"inputText": {"text": text_words},"selfInfo": {"location": {"city": "北京","province": "北京","street": "车公庄西大街"}}},"userInfo": {"apiKey": turing_api_key,  # 你的图灵机器人apiKey"userId": "Nieson"  # 用户唯一标识(随便填, 非密钥)}}

通过调用requests模块和json模块把得到的回复信息存储在text里。

req["perception"]["inputText"]["text"] = text_words
response = requests.request("post", api_url, json=req, headers=headers)
response_dict = json.loads(response.text)result = response_dict["results"][0]["values"]["text"]
print("AI Robot said: " + result)
return result

6. 文字转语音-TTS

得到文字回复信息后,我们需要把文字信息转成音频文件,这样才可以通过音频播放设备播放,这个过程叫做TTS。TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。

### Text_to_Speech,TTS ###
def TTS(text):TTS_out  = client.synthesis(text, 'zh', 1, {'vol': 5,'per': 4,'aue':6})print('TTS_out = ',type(TTS_out))# 识别正确返回语音二进制 错误则返回dict 参照下面错误码if not isinstance(TTS_out, dict):with open('audio.wav', 'wb') as f:f.write(TTS_out)

这里必须再夸赞一下百度,百度的TTS api 支持选择男声和女声,而且有不同的音色,并且支持语速、语调和音量的选择,关键还是免费,这一点百度做的实在是良心。同时输出格式支持wav、mp3、pcm等,对硬件播放设备的兼容支持非常友好。

# 发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声
PER = 4
# 语速,取值0-15,默认为5中语速
SPD = 5
# 音调,取值0-15,默认为5中语调
PIT = 5
# 音量,取值0-9,默认为5中音量
VOL = 5
# 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
AUE = 3FORMATS = {3: "mp3", 4: "pcm", 5: "pcm", 6: "wav"}
FORMAT = FORMATS[AUE]

7. 语音播放-Speaking

跟录音模块一样,根据硬件平台设备的不同,可以选择不同的播放方式,linux系统可以选择使用aplay命令播放,windows和mac电脑可以选择使用python的pyaudio模块播放,代码很简单,这里就不赘述了。

结语

上面ASR、TTS等模块同样可以使用腾讯或阿里的AI api 接口接入调用,原理和方法类似,在此就不做赘述。该程序仅仅是完成了语音对话方面的内容,比较全面的的智能语音python项目,可以借鉴的优秀案例比如潘伟洲的wukong-robot,不但囊括了上述语音转换接口,还涉及到了唤醒词训练,语音技能以及远程控制,代码全部梳理一遍,对智能音箱涉及的基本知识就有了一个比较全面的了解。

100行代码撸一个语音对话助手相关推荐

  1. 70行代码撸一个桌面自动翻译神器(采用Markdown格式编写)

    70行代码撸一个桌面自动翻译神器 前言 工作上经常需要与外国友人邮件沟通,奈何工作电脑没有安装有道词典一类的翻译软件,结合自己的需要,自己撸一个桌面翻译神器. 基本思路:基于PySimpleGUI开发 ...

  2. 用Arduino玩转掌控板(ESP32):不到100行代码实现Siri语音控制 → WebServer应用示例...

    众所周知,掌控板在创客教育中用的非常广泛,它是一块基于 ESP32 的学习开发板.大家对掌控板编程,用的比较多的都是图形化编程的方式,比如 mPython.Mind+ 等.但是,既然掌控板是基于 ES ...

  3. PONG - 100行代码写一个弹球游戏

    大家好,欢迎来到 Crossin的编程教室 ! 今天跟大家讲一讲:如何做游戏 游戏的主题是弹球游戏<PONG>,它是史上第一款街机游戏.因此选它作为我这个游戏开发系列的第一期主题. 游戏引 ...

  4. 70行代码撸一个桌面自动翻译神器!

    文 | 咕隆先森 来源:Python 技术「ID: pythonall」 工作上经常需要与外国友人邮件沟通,奈何工作电脑没有安装有道词典一类的翻译软件,结合自己的需要,自己撸一个桌面翻译神器. 基本思 ...

  5. 70行代码撸一个桌面自动翻译神器

    工作上经常需要与外国友人邮件沟通,奈何工作电脑没有安装有道词典一类的翻译软件,结合自己的需要,自己撸一个桌面翻译神器. 基本思路:基于PySimpleGUI开发桌面GUI→获取键盘输入→接入谷歌翻译A ...

  6. 100行代码写一个Compose版华容道

    之前写过几个 Compose 的 demo,但一直没使用到 Gesture, Theme 等特性,于是写了一个华容道的小程序来展示上述这些特性.写完后又一次被 Compose 的生产力所折服,整个程序 ...

  7. 一天,我用100行代码撸了一个表白神器!喜欢拿走~

    5月21日,"程序员用代码花式表白"顶上热搜,某广场的大屏,出现了程序员用Java语言,拼成了薇娅头像进行表白,网友不禁发出感叹:这样的程序员还缺女朋友吗? 看到这儿,你以为学习J ...

  8. 【Qt串口调试助手】1.0 - 400行代码撸一个Qt5串口调试助手框架

    1. 设计目的 使用Qt设计一款串口调试助手,具有自动扫描串口端口.列表端口硬件信息.16进制转换.收发数目统计.定时发送等功能.代码注释清晰,应用无内建缓存区,运行效率高,适合拿来学习和作为二次开发 ...

  9. python 2048游戏的设计_Python练习:100行代码实现一个简易的2048游戏

    一.任务目标 1.一个在命令行下的2048游戏 2.主要实现功能:判断游戏是否结束:在随机空白位置生成新的数字:上下左右四个方向上进行平移数字并将能合并的数字进行合并:接收键盘输入:将数字阵列显示到命 ...

最新文章

  1. Web前端开发应该避免的几个思维误区
  2. JAVA中String类的intern()方法的作用
  3. word2vec原理_word2vec论文阅读笔记
  4. python中mainloop添加背景_Python实例讲解 - tkinter canvas (设置背景图片及文字)
  5. python对excel的操作
  6. 2021年度618品牌营销分析报告
  7. java布尔三目运算符_Java关系运算符,boolean运算符,三元运算符
  8. 2020年春季计算机网络考试,国家开放大学2020年春季学期电大考试《计算机网络》精选考试题及答案...
  9. SQL to ElasticSearch DSL改进
  10. 【Linux】Windows Ubuntu 双系统开机选择界面设置
  11. 华为系列设备优先级总结(三)
  12. VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)
  13. 医院his系统机房服务器,医院 HIS系统建设项目 硬件部署方案.docx
  14. Mac、移动硬盘中拷贝后文件夹和文件都为灰色解决办法
  15. python怎么过滤标点符号大全_python 过滤标点符号
  16. 专升本高数——第八章 多元函数积分学【学习笔记】
  17. MyBatis Plus Generator 代码生成器 v3.5.x 案例,含校验、MapStruct、Swagger、QO、VO,自定义 FreeMarker 模板引擎
  18. ue4风格化材质_ue4商城资源Stylized Terrain Pack of 50 Materials50种材质风格化地形包
  19. 如何在library中使用productFlavors
  20. 微信小程序、app集成微信支付

热门文章

  1. python2.7的字符串拼接
  2. 超简单看懂匈牙利算法
  3. Windows 去除我的电脑页面多余的设备和驱动器图标
  4. 开源电子书项目FBReader初探(六)
  5. Gmail 中出现紫字的怪现象
  6. [索引]引用Balancing bike sharing systems with constraint programming的文章
  7. Matlab将图像序列合成为视频
  8. 为什么我推荐用户故事地图?
  9. laravel轮播图管理api
  10. Privoxy + tor = ?