跳到主要内容

香橙派Orangepi3B制作AI大模型语音对话盒子

一、所需设备

  1. Orangepi3B开发板

  2. USB麦克

  3. WS2812环形LED灯带

  4. 杜邦线

  5. 外壳(非必须)

  6. 高速TF 卡,或 EMMC

二、运行环境环境:

::: info Tip

第一次用的ubuntu_jammy,audio 库和 snowboy 有兼容问题

第二次用树莓派os ,手上没有键盘没法继续用

第三次用的debian_bookworm_desktop 最终成功

:::

  • Debian bookworm

  • Python3.9+

三、所需软件:

Orangepi 刷机工具去官方下载http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3B.html

四、安装配置系统

  1. 根据官网指引下载对应的 Debian 系统,通过刷写工具刷写系统。

注意:刷完系统一定概率不能启动,如果启动不了,需要参照手册指引RKDevTool 清空SPIFlash

  1. 进入系统有一下两种方式

连接显示器、键盘、鼠标配置操作,手上没有键盘可以开启虚拟键盘应急

连接网线通过 ssh 登录,通过命令 nmcli dev wifi connect wifi_name password wifi_passwd 配置 wifi 连接,set_vnc.sh 配置 vnc

五、开发工具

vscode 本地开发或者 vscode+ssh 远程在Orangepi上开发

PyCharm+git 方式代码同步

六、唤醒词实现

  1. 唤醒词 snowboy

https://github.com/Kitt-AI/snowboy

需要在运行机上编译对应的库

下载源码进入swig/Python3目录执行 make

这里需要注意:MakeFile 文件里配置有点问题 make前需要修改

SNOWBOYDETECTLIBFILE = $(TOPDIR)/lib/aarch64-ubuntu1604/libsnowboy-detect.a

编译成功后 参照 github 上的说明集成到工程里

生成模型

https://snowboy.hahack.com/

在这个网页自行录音三个以上,生成模型下载到本地即可测试

detector = snowboydecoder.HotwordDetector(model模型, sensitivity=敏感度)

支持多组模型同时用

  1. 申请模型接口

以通义千问为例:阿里云注册账号,找到“模型服务灵积”菜单开启服务,获取api_key

按装 sdk dashscope

  1. 语音文字互转

我用的 azure 的,用法参考

https://learn.microsoft.com/zh-cn/azure/ai-services/speech-service/text-to-speech

  1. 唤醒入口

唤醒入口支持多个唤醒词,触发某个唤醒词会执行回调

detector.start(detected_callback=snowboydecoder.play_audio_file,

interrupt_check=interrupt_callback, sleep_time=0.03) demo.py 中这段代码 detected_callback 就是回调,回传一个 index

触发回调后面就是进行大模型对话部分

七、大模型调用

因为是语音交互,所以要先把声音转成文字

代码比较简单,直接通过 麦克风识别

speech_recognizer = speechsdk.SpeechRecognizer(speech_config=tts_config)

speech_recognition_result = speech_recognizer.recognize_once_async().get()

speech_recognition_result.text 返回的文本

api_key 根据文档设置

下一步,把识别好的文本内容传给大模型接口

from dashscope import Generation

gen = Generation()

response = gen.call(

Generation.Models.qwen_turbo,

messages=message, result_format='message', # set the result is message format. stream=True ) message 是数组,可以设置上下文,根据自己的需求设置数量

获得大模型返回内容后,tts 转语音,主要代码如下

speech_config.speech_synthesis_voice_name = 指定嗓音

audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True) speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config) result = speech_synthesizer.speak_text_async(text).get()

到这里对话交互就实现完了,对话交互是整个功能里最简单的了

优化和填坑是比较耗时的部分

八、总结

snowboy 识别效果比较差,项目也处于停止状态,不适合要求高的情况下使用。 其他方案 picovoice 识别效果好些但不支持中文 语音识别芯片,识别效果好,需要硬件方式集成。