title: 单片机学习:第一篇 基于Python的树莓派语音助手
tags: 树莓派,python,语音助手,百度AIP

目录

一、pyaudio录音

二、语音识别

三、与图灵机器人对话

四、语音合成

五、封装


树莓派功能十分强大,作为一个微型电脑,独特的阵脚设计使得树莓派开发的自定义程度非常高。本篇博客通过使用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.mit.edu/hubert/pyaudio/介绍上有对pyaudio的详细介绍,以官网示例:
创建一名为rec的python文件 ```sudo nano rec.py```

import RPi.GPIO as GPIO
import pyaudio
import wave
import os
import sys
def rec_fun():# 隐藏错误消息,因为会有一堆ALSA和JACK错误消息,但其实能正常录音# os.close(sys.stderr.fileno())BUTT = 26    # 开始录音的按钮:一边接GPIO26,一边接地GPIO.setmode(GPIO.BCM)# 设GPIO26脚为输入脚,电平拉高,也就是说26脚一旦读到低电平,说明按了按钮GPIO.setup(BUTT, GPIO.IN, pull_up_down = GPIO.PUD_UP)# wav文件是由若干个CHUNK组成的,CHUNK我们就理解成数据包或者数据片段。CHUNK = 512 FORMAT = pyaudio.paInt16  # pyaudio.paInt16表示我们使用量化位数 16位来进行录音RATE = 16000  # 采样率1.6k。WAVE_OUTPUT_FILENAME = "command.wav"print('请按住按钮开始录音...')GPIO.wait_for_edge(BUTT, GPIO.FALLING)# To use PyAudio, first instantiate PyAudio using pyaudio.PyAudio(), which sets up the portaudio system.p = pyaudio.PyAudio()stream = p.open(format = FORMAT,channels = 1,    # cloud speecAPI只支持单声道rate = RATE,input = True,frames_per_buffer = CHUNK)print("录音中...")frames = []# 按住按钮录音,放开时结束while GPIO.input(BUTT) == 0:data = stream.read(CHUNK)frames.append(data)print("录音完成,输出文件:" + WAVE_OUTPUT_FILENAME + '\n')stream.stop_stream()stream.close()p.terminate()wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')wf.setnchannels(1)wf.setsampwidth(p.get_sample_size(FORMAT))    # Returns the size (in bytes) for the specified sample format.wf.setframerate(RATE)wf.writeframes(b''.join(frames))wf.close()return
# 可以直接运行rec.py进行测试,同时保证该文件import时不会自动运行
if __name__ == '__main__':rec_fun()

通过树莓派一 点亮LED灯:https://www.luodeb.top/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
import osAPP_ID = '你的IDID'
API_KEY = '你的KEYKEY'
SECRET_KEY = '你的secret_key'# 新建一个 AipSpeech
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)# 读取文件
def get_file_content(filePath):   #filePath待读取文件名with open(filePath, 'rb') as fp:return fp.read()
# 语音识别
def stt(filename):# 识别本地文件result = client.asr(get_file_content(filename),'wav',16000,{'dev_pid': 1537,}      # dev_pid 参数表示识别的语 言类型 1537表示普通话 )print (result)return result['result']# 解析返回值,打印语音识别的结果 if result['err_msg']=='success.': word = result['result'][0].encode('utf-8')       # utf-8 编码 if word!='': 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]) else: print (word.decode('utf-8').encode('gbk')) with open('demo.txt','wb') as f: f.write(word) f.close() else: print ("音频文件不存在或格式错误") else: print ("错误")
# main 函数 识别本地录音文件 yahboom.wav
if __name__ == '__main__':stt('command.wav')   # command.wav为待读取文件,请替换

三、与图灵机器人对话

使用图灵机器人基本原理就是使用urllib.request模块,向接口地址发送HTTP POST请求,请求中加入了聊天内容。(返回内容是一个字典)
首先我们需要申请一个机器人:官网入口:http://www.turingapi.com/
python代码参考:

import json
import urllib.request
def chat(question):api_url = "http://openapi.tuling123.com/openapi/api/v2"text_input = questionreq = {"perception":{"inputText":{"text": text_input},"selfInfo":{"location":{"city": "xxx","province": "xxx","street": "xxx"}}},"userInfo": {"apiKey": "xxxxxxxxxxxxx",    #你的key"userId": "123"         #唯一的标识,自选即可}}# 将字典格式的req转为utf8编码的字符串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)    print('得到回答,输出为字典格式:')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}print(answer)return(answer)# 一般的输出方式else: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()print(answer)return(answer)if __name__ == '__main__':with open("demo.txt", "r",encoding='UTF-8') as f:text  = f.read()  # 读取文件eg_question = textchat(eg_question)

四、语音合成

我同样选择了百度的语音合成(注意,AI平台新建应用后,语音合成技术需要自行领用。语音识别的key与合成的key不一样,使用请注意)。示例文档自行参考,提供参考代码:

#encoding:utf8
from aip import AipSpeech
import os""" 你的 APPID AK SK """
APP_ID = 'xxxxx'
API_KEY = 'xxxxxxxxxxxxxxxx'
SECRET_KEY = 'chMdMAS0acD7sPS6FhP3a3iOijU7wMVl'
def speak(text_content):client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)texts = text_contentresult = client.synthesis(texts , options={'vol':5})print('\n' + "正在调用语音合成API...")if not isinstance(result,dict):with open('answer.mp3','wb') as f:f.write(result)else:print(result)print("播放音频中...")print("以下均为mplayer的输出内容\n")os.system("mplayer answer.mp3")return
if __name__ == '__main__':   with open("result.txt", "rb") as f: # 打开文件text  = f.read()  # 读取文件       eg_text_content = textspeak(eg_text_content)         

五、封装

至此,我们的录音、识别、对话、合成已经完成了,开始对这四个py文件进行封装。
在封装时,增加一个获取获取歌曲直链url1.py文件。
一个简单的if else 完成了图灵机器人对话到在线放歌的切换。
当然,读者还可以进一步完善,例如实现与图灵机器人的多次对话直到退出。

需要参考我的全部代码,可以去我的资源下载

单片机学习:第一篇 基于Python的树莓派语音助手相关推荐

  1. TensorRT学习第一篇:python 中 TensorRT 使用流程之onnx

    python 版本的TensorRT 什么是TensorRT 基本流程 python 中 TensorRT 使用流程之 onnx 1.查询自己电脑的 TensorRT 版本: 2.查询TensorRT ...

  2. 基于python的智能语音助手下载_GitHub - tengqian/DuerOS-Python-Client: 基于DuerOS的个人的智能语音助手...

    DuerOS-Python-Client使用说明 文档参考 运行依赖 gstreamer1.0 gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly ...

  3. 基于python的智能语音助手下载_GitHub - shaocj/DuerOS-Python-Client: 基于DuerOS的个人的智能语音助手...

    DuerOS-Python-Client使用说明 文档参考 运行依赖 gstreamer1.0 gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly ...

  4. 基于python的智能语音助手下载_GitHub - zqiang/DuerOS-Python-Client: 基于DuerOS的个人的智能语音助手...

    DuerOS-Python-Client使用说明 运行依赖 gstreamer1.0 gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly pytho ...

  5. 基于python的智能语音助手下载_GitHub - qq53182347/DuerOS-Python-Client: 基于DuerOS的个人的智能语音助手...

    DuerOS-Python-Client使用说明 运行依赖 gstreamer1.0 gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly pytho ...

  6. Python中的TCP的客户端UDP学习----第一篇博客

    Python中的TCP的客户端&UDP学习--第一篇博客 PS: 每日的怼人句子"我真想把我的脑子放到你的身体里,让你感受一下智慧的光芒" 先说UDP流程 发送: 创建套接 ...

  7. 深度学习实战篇-基于RNN的中文分词探索

    深度学习实战篇-基于RNN的中文分词探索 近年来,深度学习在人工智能的多个领域取得了显著成绩.微软使用的152层深度神经网络在ImageNet的比赛上斩获多项第一,同时在图像识别中超过了人类的识别水平 ...

  8. MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB

    2019独角兽企业重金招聘Python工程师标准>>> MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB 0.确保mac已经安装了HomeBrew ( ...

  9. python传递参数格式_Python语言学习基础篇之Python发送Post请求之根据参数位置传参、数据类型、不同方式传参...

    本文主要介绍了Python语言学习基础篇之Python发送Post请求之根据参数位置传参.数据类型.不同方式传参,通过具体的内容向大家展现,希望对大家Python语言的学习有所帮助. 目录 一.验证 ...

最新文章

  1. TVM性能评估分析(二)
  2. 好多Javascript日期选择器呀-6
  3. Linux 运维工程师入门须掌握的 10 个技术点
  4. 解决vuex页面刷新导致数据丢失问题
  5. linux db2乱码,DB2乱码(开始和结束,字符串中间没有好的办法)
  6. leetcode89 (2022.1.8)
  7. java基础自学教程_Java基础自学教程(全套)
  8. 数据分析职位需求分析报告-数据来源于Boss直聘网站
  9. 使用BackTrack4清除/修改Windows用户密码
  10. 解析阿里云V3版本的专有云网络架构原理,构架图图解
  11. 图书管理系统(数据库)
  12. c# chart 各个属性_C#之Chart控件系列教程
  13. “离职同事在工作群抢红包被踢”:学会退群,是职场人的基本修养
  14. 组件化-创建私有组件库库
  15. ubuntu设置相机为固定焦距
  16. java毕业设计电影推荐网站mybatis+源码+调试部署+系统+数据库+lw
  17. Linux ❉ Chronyd时间同步服务器详解
  18. uniapp实现附有二维码的图片的本地保存
  19. OpenCV | Mat类的copyT、clone、=赋值的区别
  20. C++ 牛客网做题总结

热门文章

  1. 企业常用的几个人力资源管理系统功能!
  2. 如何给U盘或移动硬盘添加个性的图标? | 不着调软件
  3. 盛大创新院赞助首届.NET技术交流会 - 演讲录像及下载
  4. Featuretools快速使用指南--看这一篇就够了
  5. 同程艺龙Q3财报:深耕“下沉”之外,诠释另一个增长维度
  6. 小白初学Python(1) - 输入和输出
  7. 全国潮汐表 v10.1.1
  8. 西门子PLC地址的分配方式有哪些?
  9. KEIL MDK链接脚本-分散加载文件sct
  10. consumer editions和business editions的区别