title: 单片机学习:第一篇 基于Python的树莓派语音助手 tags: 树莓派,python,语音助手,百度AIP
树莓派功能十分强大,作为一个微型电脑,独特的阵脚设计使得树莓派开发的自定义程度非常高。本篇博客通过使用python语言,封装一个简单的语音助手程序。制作一个语音助手你需要如下物品: ``` 1:一个树莓派(3代、4代皆可) 2:免驱的usb声卡(声卡需接在树莓派usb接口) 3:麦克风(接在声卡上) 4:有线音响(音响可连在声卡上,也可连在树莓派的3.5mm接口上) (树莓派播放设备默认使用3.5mm接口,具体过程需要自定义播放设备) ``` 如果要设置usb声卡输出,参考配置声卡教程:https://www.jianshu.com/p/f414b85b9e71,如果使用默认3.5mm接口输出可以忽略。 设计语音助手有如下过程:录音、语音识别、图灵机器人对话、语音合成,以下对各个过程进行介绍。
一、pyaudio录音
使用python语言进行录音,主要是将说话者声音输出成一段音频文件。对于python来说,这很容易。通过引用pyaudio库,可以进行录音、播放、生成wav文件等。 首先,我们在树莓派上需要下载pyaudio库: ```pip3 install pyaudio``` 在pyaudio的官网http://people.csail./hubert/pyaudio/介绍上有对pyaudio的详细介绍,以官网示例: 创建一名为rec的python文件 ```sudo nano rec.py```
# 隐藏错误消息,因为会有一堆ALSA和JACK错误消息,但其实能正常录音 # os.close(sys.stderr.fileno()) BUTT = 26 # 开始录音的按钮:一边接GPIO26,一边接地 # 设GPIO26脚为输入脚,电平拉高,也就是说26脚一旦读到低电平,说明按了按钮 GPIO.setup(BUTT, GPIO.IN, pull_up_down = GPIO.PUD_UP) # wav文件是由若干个CHUNK组成的,CHUNK我们就理解成数据包或者数据片段。 FORMAT = pyaudio.paInt16 # pyaudio.paInt16表示我们使用量化位数 16位来进行录音 WAVE_OUTPUT_FILENAME = 'command.wav' GPIO.wait_for_edge(BUTT, GPIO.FALLING) # To use PyAudio, first instantiate PyAudio using pyaudio.PyAudio(), which sets up the portaudio system. stream = p.open(format = FORMAT, channels = 1, # cloud speecAPI只支持单声道 frames_per_buffer = CHUNK) while GPIO.input(BUTT) == 0: data = stream.read(CHUNK) print('录音完成,输出文件:' + WAVE_OUTPUT_FILENAME + '\n') wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') wf.setsampwidth(p.get_sample_size(FORMAT)) # Returns the size (in bytes) for the specified sample format. wf.writeframes(b''.join(frames)) # 可以直接运行rec.py进行测试,同时保证该文件import时不会自动运行 if __name__ == '__main__':
通过树莓派一 点亮LED灯:https://www./2020/06/21/raspberry/?from=timeline,我们对树莓派的阵脚已经有了大概了解。 按钮录音,是通过按钮控制阵脚高低电平。在上述代码里引用```import RPi.GPIO as GPIO```,选择26号输出脚和GND。 执行后按住按钮开始录音,会在rec.py同目录下生成command.wav文件。
二、语音识别
我选择了百度AIP平台,使用其语音识别技术。(当然也可使用Google、科大讯飞等平台) 1. 申请百度AIP账号与应用 在百度AI开发平台:https://ai.baidu.com/?track=cp:aipinzhuan|pf:pc|pp:AIpingtai|pu:title|ci:|kw:10005792注册账号,再在控制台创建一个新应用 2. python调用百度AIP 官网文档中有详细使用语音识别技术,包括python的示例。首先导入AipSpeech, 即百度AI语音识别的Python SDK客户端(```pip3 install baidu-aip```)。附上代码如下:
from aip import AipSpeech SECRET_KEY = '你的secret_key' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) def get_file_content(filePath): #filePath待读取文件名 with open(filePath, 'rb') as fp: result = client.asr(get_file_content(filename), {'dev_pid': 1537,} # dev_pid 参数表示识别的语 言类型 1537表示普通话 if result['err_msg']=='success.': word = result['result'][0].encode('utf-8') # utf-8 编码 if word[len(word)-3:len(word)]==',': print (word[0:len(word)-3]) with open('demo.txt','wb') as f: f.write(word[0:len(word)-3]) print (word.decode('utf-8').encode('gbk')) with open('demo.txt','wb') as f: # main 函数 识别本地录音文件 yahboom.wav if __name__ == '__main__': stt('command.wav') # command.wav为待读取文件,请替换
三、与图灵机器人对话
使用图灵机器人基本原理就是使用urllib.request模块,向接口地址发送HTTP POST请求,请求中加入了聊天内容。(返回内容是一个字典) 首先我们需要申请一个机器人:官网入口:http://www./ python代码参考:
api_url = 'http://openapi./openapi/api/v2' 'apiKey': 'xxxxxxxxxxxxx', #你的key 'userId': '123' #唯一的标识,自选即可 req = json.dumps(req).encode('utf8') print('\n' + '正在调用图灵机器人API...') http_post = urllib.request.Request(api_url, data=req, headers={'content-type': 'application/json'}) response = urllib.request.urlopen(http_post) response_str = response.read().decode('utf8') response_dic = json.loads(response_str) intent_code = response_dic['intent']['code'] if(intent_code == 10023): results_url = response_dic['results'][0]['values']['url'] results_text = response_dic['results'][1]['values']['text'] with open('result.txt','w') as f: f.write(results_text) # 自带文件关闭功能,不需要再写f.close() answer = {'code': intent_code, 'text': results_text, 'url':results_url} results_text = response_dic['results'][0]['values']['text'] answer = {'code': intent_code, 'text': results_text} with open('result.txt','w') as f: f.write(results_text) # 自带文件关闭功能,不需要再写f.close() if __name__ == '__main__': with open('demo.txt', 'r',encoding='UTF-8') as f:
四、语音合成
我同样选择了百度的语音合成(注意,AI平台新建应用后,语音合成技术需要自行领用。语音识别的key与合成的key不一样,使用请注意)。示例文档自行参考,提供参考代码:
from aip import AipSpeech API_KEY = 'xxxxxxxxxxxxxxxx' SECRET_KEY = 'chMdMAS0acD7sPS6FhP3a3iOijU7wMVl' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) result = client.synthesis(texts , options={'vol':5}) print('\n' + '正在调用语音合成API...') if not isinstance(result,dict): with open('answer.mp3','wb') as f: print('以下均为mplayer的输出内容\n') os.system('mplayer answer.mp3') if __name__ == '__main__': with open('result.txt', 'rb') as f: # 打开文件
五、封装
至此,我们的录音、识别、对话、合成已经完成了,开始对这四个py文件进行封装。 在封装时,增加一个获取获取歌曲直链url1.py文件。 一个简单的if else 完成了图灵机器人对话到在线放歌的切换。 当然,读者还可以进一步完善,例如实现与图灵机器人的多次对话直到退出。
需要参考我的全部代码,可以去我的资源下载
|