树莓派准备
包的安装
Python 3 默认安装在 Raspberry Pi 操作系统上,并用于许多重要功能。干扰系统 Python 安装可能会导致操作系统出现问题,因此,如果安装第三方 Python 库,请使用正确的包管理工具,这一点很重要。
有两种方法可以将库安装到默认python
发行版中。您可以使用 apt
并安装预配置的系统软件包,也可以使用 pip
安装未作为 Raspberry Pi OS 的一部分分发的软件包。
例如,要安装 Python 3 库以支持 Raspberry Pi 构建 HAT,您需要:
terminal
$ sudo apt install python3-build-hat
但是我们大概率会遇到包管理工具冲突的问题
产生此错误的原因是您尝试将第三方包安装到系统 Python 中。对于 Python 用户来说,一个长期存在的实际问题是操作系统包管理器(如 apt
)与 Python 特定的包管理工具(如 pip
)之间的冲突。这些冲突包括 Python 级 API 不兼容和文件所有权冲突。
因此,从 Bookworm 开始,通过 pip
安装的软件包必须使用 < /span>venv
。虚拟环境是一个容器,您可以在其中安全地安装第三方模块,这样它们就不会干扰或破坏您的 Python 系统。
虚拟环境
要使用虚拟环境,您需要创建一个容器来存储环境。您可以通过多种方法来完成此操作,具体取决于您想要使用 Python 的方式。您可以继续的一种方法是为您创建的每个 Python 项目创建一个新的虚拟环境。在这里,您将创建一个目录来保存您自己的代码以及虚拟环境目录:
terminal
$ mkdir my_project
$ cd my_project
$ python -m venv (你的项目名)
如果您现在查看 my_project
目录,您将看到一个名为 你的项目名
的目录。
下一步,我们来通过指令: python -m venv --system-site-packages (你的项目名)
来创建虚拟环境。`
terminal
$ source (你的项目名)/bin/activate
(你的项目名) $
现在我们就可以使用 pip
进行安装了。
Pycharm准备
所需要的包
以下是需要安装的一些python依赖包
pip install speech_recognition
安装speech_recognition依赖包, 用于录音、生成wav文件pip install baidu-aip
安装百度AI的sdk, 调用语音技术接口将音频识别为文本数据返回pip install pygame
安装pygame依赖包, 将文本信息以音频的格式播放出来
编程逻辑
- 第一步: "拾音"
- 第二步: STT转换
- 第三步: MOSS机器人回复文本
- 第四步: TTS转换 + 语音合成
- 第五步: 外放语音
第一步: 拾音
首先我们测试录音设备是否存在。我们在树莓派终端里面输入指令:
arecord -l
会得到如下回复:
这就是说明我们的设备是存在的。我们也能在这里看到有几个设备,可以选择用哪个。
arecord -D "plughw:3" -f S16_LE -r16000 -d4 /home/admin/PyCode/WS_Project_MOSS/voices/myvoices.wav
python
参数解析
- -D 指定录音设备,-D hw:1,0的意思就是选用card1(SmartIC Audio Device)设备录音
- -c 设置通道个数,-c2的意思就是录制2通道的音频文件
- -r 设置采样率,-r16000的意思就是设置采样率为16000
- -f 指定录音格式,-fS16_LE的意思就是录制S16_LE格式的音频文件
-h,---help(帮助)
-V,--version(打印版本信息)
-l,--list-devices(列出全部声卡和数字音频设备)
-L,--list-pcms(列出全部PCM定义)
-D,--device(指定PCM设备名称)
-q,--quiet(安静模式)
-t,--file-type(文件类型voc,wav,raw或au)
-c,--channels(设置通道数)
-f,--format(设置格式)
-r,--rate(设置频率)
-d,--duration(设置持续时间,单位为秒)
-s,--sleep-min(设置最小休眠时间)
-M,--mmap(mmap流)
-N,--nonblock(设置为非块模式)
-B,--buffer-time(缓冲持续时长,单位为微秒)
-v,--verbose(显示PCM结构和设置)
-I,--separate-channels(设置为每个通道一个单独文件)
第二步:语音识别
通过百度语音识别服务(可以去官网上找一下,然后注册应用,获得自己的 APP_ID
, APP_KEY
, SECRET_KEY
)
根据百度语音识别官方给的文档,我们来对接一下这个API接口
python
from aip import AipSpeech
import request
import json
# 配置一下API接口所需要的参数
APP_ID = '___________'
API_KEY = '________________'
SECRET_KEY = '___________________'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
path = 'voices/myvoices.wav'
def listen():
# 读取录音文件
with open(path, 'rb') as fp:
voices = fp.read()
try:
# 参数dev_pid:1536普通话(支持简单的英文识别)、1537普通话(纯中文识别)、1737英语、1637粤语、1837四川话、1936普通话远场
result = client.asr(voices, 'wav', 16000, {'dev_pid': 1537})
result_text = result["result"][0]
print("我听到你说: " + result_text)
return result_text
except KeyError:
print(result.get('err_no'))
第三步:机器人的思考回答
现在我们来等待机器人的回复。这里我们需要调用接口,我们现在使用的是 ERNIE-BOT-4.0
, 我们后续会尝试一下调用 ChatGPT的API接口,就相当于是把机器人的大脑🧠换一下。
很简单,依据 文档,我们来写一下以下两个函数。
python
def get_access_token():
"""
使用 API Key,Secret Key 获取access_token,替换下列应用API Key、应用Secret Key
"""
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的信息&client_secret=你的信息"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
def bot(question):
# url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + get_access_token()
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=24.3990f1717b7636be7b8a4de154a49b5a.2592000.1705210204.282335-45017968"
payload = json.dumps({
"messages": [
{
"role": "user",
"content": f"{question}"
}]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
temp = json.loads(response.text)
print(temp.get('result'))
return temp.get('result')
第四步:TTS转换 + 外放语音
接下来,我们要把机器人回复给我们的文字转换成语音
python
import os
import sys
def say(response):
result = client.synthesis(f'{response}', 'zh', 1, {
'vol': 5,
})
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
with open('robot/audio.mp3', 'wb') as f:
f.write(result)
os.system('sudo aplay /home/admin/PyCode/WS_Project_MOSS/robot/audio.mp3')
第五步:整合
详情请阅览 gitee 仓库源码
我是老狼,欢迎订阅!