树莓派大模型本地语音聊天机器人搭建推荐
一直以来,端侧应用都是大模型领域的热点话题。最近人形机器人又火了一把,大家的目光重新聚焦到“具身智能”上——怎么把大模型的能力塞进低功耗的客户端设备里?端侧设备有个现实问题:网络连接经常不稳定,带宽也有限,指望全靠云服务跑大模型并不现实。更何况安全性和隐私问题在本地设备上更敏感,所以本地运行才是最靠谱的选择。
最近看到一个很有意思的项目:在树莓派上跑一个大模型语音聊天机器人,而且是全本地运行的。交互方式很直接——按一下按钮开始说话,松开按钮,大模型生成回答,再用非常自然的语音回给你。整个过程不依赖网络。比如你问它“How do you live?”,它会真的像真人一样跟你聊起来。
硬件方面需要准备的东西不算复杂:
4GB内存的树莓派4(3袋里论上也行,只要内存够用)
麦克风(树莓派本身不带麦克风,接个USB的就成)
喇叭(USB喇叭可以,不过这里用的是自带喇叭的HDMI显示屏,所以走HDMI音频输出更方便)
按钮,普通的2-wire按钮即可,一条线接button,一条线接ground。这里用的是从Google AIY VoiceKit上拆下来的,把BTN线(Pin 3)接到树莓派的GPIO 8,GND线(Pin 1)接到GPIO 6。
接线后大概是这样的效果(这里就不放额外图片了,实际接好就行)。
软件层面由三大组件组成:
语音识别(ASR):把用户说的话转成文字。这里用的是whisper.cpp,也就是OpenAI Whisper的C++实现,效率很高。
大语言模型(LLM):根据用户的文字请求生成回答。用的是TinyLlama 1.1B,通过llamafile打包成ARM64可执行文件,直接在树莓派上跑。
语音合成(TTS):把LLM的回答文本合成自然的语音。这里用的是piper。
树莓派上运行的是Ubuntu server for Raspberry Pi,标准配置,没有额外折腾。
整个工作流程很直观:用户按下按钮,GPIO 8状态改变,树莓派打开麦克风开始录制语音;松开按钮,录音停止,临时文件存本地。然后whisper.cpp把语音转成文字,作为提示输入给TinyLlama,TinyLlama生成回答文本,最后piper把文本转成语音播放出来。
不过实际跑起来有个明显的问题:树莓派4虽然内存够,但跑TinyLlama 1.1B的速度还是偏慢,大概每秒只能生成4到5个token。如果回答稍长,用户就要等很久才能听到回应,体验确实不好。为了解决这个问题,项目用了两种策略:一是在系统prompt里明确要求LLM限制回答字数;二是采用流式输出,每生成一个完整的句子就立刻调用piper合成语音,这样用户不用等到全文生成完,等待时间大大缩短。
