提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、语音识别
- 二、语音合成
- 1.引入库
- 2.注册百度云账号,获取AppID和APIKey
- 3.配置必要的信息(语音交互)
- 4.合成请求token的url、获取token
- 5.设置音频的属性,采样率,格式等
- 6.读取文件二进制内容
- 7.json封装、设置headers和请求地址url、用post方法传数据
- 8.录音
- 9.识别,反馈到百度云,然后在接受反馈,调用百度云。
前言
提示:这里可以添加本文要记录的大概内容:
在校大学生,利用树莓派制作智能音箱,分享制作思路与过程。制作时首先理清思路,先实现语音识别,其次语音合成,然后实现交互功能,最后导入树莓派。
提示:以下是本篇文章正文内容,下面案例可供参考
一、语音识别
1、安装插件
win+r并输入cmd回车
(1)输入pip install pyaudio会出现问题(部分可能不会出问题)
(2)解决办法
输入python -m pip install --upgrade pip回车更新python
(3)安装成功后,再在窗口输入pipwin install pyaudio
2、在进行安装python SDK
pip install baidu-aip
二、语音合成
1.引入库
代码如下(示例):
import os
from os import system
import aip
from aip import AipSpeech
import wave
import requests
import json
2.注册百度云账号,获取AppID和APIKey
进行录音,然后识别,反馈到百度云,然后在接受反馈,调用百度云。
3.配置必要的信息(语音交互)
代码如下(示例):
def bat(voice_path):baidu_server = 'https://aip.baidubce.com/oauth/2.0/token?'grant_type = 'client_credentials'client_id = 'FvM3fI7CMaMh9xTQGn22rk8t' #API KEYclient_secret = '43zRlrdf6LPhmGFbMnamEbINqwVepLaF' #Secret KEY 这里可以自己去百度注册,这里是我的API KEY 和 Secret KEY
该处使用的url网络请求的数据。
4.合成请求token的url、获取token
代码如下(示例):
url = baidu_server+'grant_type='+grant_type+'&client_id='+client_id+'&client_secret='+client_secret
res = requests.get(url).textdata = json.loads(res)token = data['access_token']
5.设置音频的属性,采样率,格式等
代码如下(示例):
VOICE_RATE = 8000FILE_NAME = voice_pathUSER_ID = '26378618' #这里的id随便填填就好啦,我填的自己昵称FILE_TYPE = 'wav'CUID="wate_play"#读取文件二进制内容f_obj = open(FILE_NAME, 'rb')content = base64.b64encode(f_obj.read()) # 百度语音识别需要base64编码格式speech = content.decode("utf-8")size = os.path.getsize(FILE_NAME)
6.读取文件二进制内容
代码如下(示例):
f_obj = open(FILE_NAME, 'rb')content = base64.b64encode(f_obj.read()) # 百度语音识别需要base64编码格式speech = content.decode("utf-8")size = os.path.getsize(FILE_NAME)
7.json封装、设置headers和请求地址url、用post方法传数据
代码如下(示例):
datas = json.dumps({'format': FILE_TYPE,'rate': VOICE_RATE,'channel': 1,'cuid': CUID,'token': token,'speech': speech,'len': size,"dev_pid":"1536"})return datasdef post(datas):headers = {'Content-Type':'application/json'}url = 'https://vop.baidu.com/server_api'# url = "http://vop.baidu.com/server_api"request = requests.post(url, datas, headers)result = json.loads(request.text)text = result.get("result")if result['err_no'] == 0:return textelse:return "Error"
8.录音
代码如下(示例):
def get_audio(filepath):input("回车开始录音 >>>") #输出提示文本,input接收一个值,转为str,赋值给aaCHUNK = 256 #定义数据流块FORMAT = pyaudio.paInt16 #量化位数(音量级划分)CHANNELS = 1 # 声道数;声道数:可以是单声道或者是双声道RATE = 8000 # 采样率;采样率:一秒内对声音信号的采集次数,常用的有8kHz, 16kHz, 32kHz, 48kHz, 11.025kHz, 22.05kHz, 44.1kHzRECORD_SECONDS = 5 #录音秒数WAVE_OUTPUT_FILENAME = filepath #wav文件路径p = pyaudio.PyAudio() #实例化stream = p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)print("*"*10, "开始录音:请在5秒内输入语音")frames = [] #定义一个列表for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): #循环,采样率11025 / 256 * 5data = stream.read(CHUNK) #读取chunk个字节 保存到data中frames.append(data) #向列表frames中添加数据data# print(frames)print("*" * 10, "录音结束\n")stream.stop_stream()stream.close() #关闭p.terminate() #终结wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') #打开wav文件创建一个音频对象wf,开始写WAV文件wf.setnchannels(CHANNELS) #配置声道数wf.setsampwidth(p.get_sample_size(FORMAT)) #配置量化位数wf.setframerate(RATE) #配置采样率wf.writeframes(b''.join(frames)) #转换为二进制数据写入文件wf.close() #关闭returndef check_disk():list_drive = psutil.disk_partitions() # 找出本地磁盘列表,保存的是结构体对象list_disk = []for drive in list_drive:list_disk.append(drive.device)return list_diskif __name__ == '__main__':list_disk = check_disk() # 检索本地磁盘dirname_path = os.path.join(list_disk[0], "voice") # 设置语音文件存放路径, if not os.path.exists(dirname_path):os.makedirs(dirname_path)filename = "voice.wav" # 定义语音文件名in_path = os.path.join(dirname_path, filename)get_audio(in_path) # 录音datas = bat(in_path) # 封装百度语音识别需要的配置信息,返回请求头res = post(datas) # 连接百度语音识别接口,得到识别结果print("识别结果:",res[0])
9.识别,反馈到百度云,然后在接受反馈,调用百度云。
代码如下(示例):
from aip import AipSpeech""" 你的 APPID AK SK """
APP_ID = '26341318'
API_KEY = '8rFjwa3GDfzEq0q22cvVrLGG'
SECRET_KEY = 'E4Ye4GVY6khGsTLGbaTvfDEc8L1FQbSs'client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
result = client.synthesis(res[0], 'zh', 1, {'vol': 5,
})# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):with open('audio.mp3', 'wb') as f:f.write(result)
最后导入树莓派
然后将树莓派连上喇叭,麦克风,即完成了树莓派智能音箱的制作