音频采集
实现项目的第一步,就是音频采集。但在查阅官方wiki后,并没有看到音频相关部分;在板子上使用arecord -l he aplay -l查看也都没有发现相关设备。
因此,音频的实现思路是先在pc上运行唤醒词识别,识别到后开始录音,录音结束后进行语音识别。
当pc端完成语音识别后,建立在Longan Pi上的FastAPI服务器将识别到的文本发送至Longan Pi,由Longan Pi完成后续一系列的步骤。
最后,GPT返回的文本经由TTS转化为语音后,再通过FastAPI返回给发起request的PC,PC接收到返回的音频后进行播放,完成整个对话流程。
先来看PC部分,如果要使用python播放或录制音频,我们需要使用到ffmpeg。先从官方GitHub下载编译好的weindows build压缩包,shared和非shared都可以,这两个版本的区别就是非shared将dll都编译在了可执行文件中。
下载完成后,解压出来,然后最关键的一部来了,ffmpeg的可执行文件都在bin中,需要手动将bin文件夹加入环境变量中。
添加好后,还需要在python中安装相应的包,我是用的python版本是 Python 3.11
pip install SpeechRecognition
pip install pydub
pip install pyaudio
首先,要根据环境噪音校准一下麦克风阈值,接下来开始采集。当音量超过阈值后还是录音,音量低于阈值一段时间后结束录音。随后将得到的音频传入语音识别模型转为文字,这里我使用的是google的模型:
import speech_recognition as sr
r = sr.Recognizer()
with sr.Microphone() as source:
r.adjust_for_ambient_noise(source)
print(">说点什么:")
audio_in = r.listen(source)
print("Processing...")
try:
text_input = r.recognize_google(audio_in, language="cmn-Hans-CN")
print("You said: " + text_input)
except sr.UnknownValueError as error:
print("Google could not understand audio")
print(error)
text_input = None
except sr.RequestError as error:
print("Could not request results from Google")
print(error)
text_input = None
运行一下,当terminal中出现“>说点什么:
”后开始说话,随后就可以看到说话内容打印在terminal中。
当然了,大多数情况下,这个命令是无法执行的,原因是默认的google服务并没法直接连接。具体的解决方法在下一篇中我们会来详细聊聊。
在上面代码中使用r.adjust_for_ambient_noise(source)
是为了根据环境情况自动设置阈值。当然,我们也可以自行进行设置,可以将其替换为下面的代码:
r.dynamic_energy_threshold = False
r.energy_threshold = 10000000
r.pause_threshold = 1.2
这三行代码的作用分别是关闭自动阈值调整,设置阈值,与设置音量低于阈值多少秒后触发停止说话。
而具体的阈值大小,可以通过energy = audioop.rms(buffer, source.SAMPLE_WIDTH)
来得到。