首先明确我要制作的项目,是一款本地实时翻译机,选用经典的ASR+MT+TTS模型,模型选用如下
ASR (语音转文字):只需要英语
SenseVoice-Small 是目前 SOTA 的轻量模型,效果很好。
替代/优化:
Whisper.cpp (Tiny/Base model): 针对 CPU 优化到了极致。如果你不上 NPU,Whisper.cpp 是最稳的。
Sherpa-Onnx (Zipformer/Paraformer): 针对嵌入式极其友好,支持流式(Streaming)识别。划重点:流式识别是实时的关键,不要等用户说完一整句才开始识别,要边说边出字。
本地翻译 (MT):英语 -> 中文
推荐方案 1 (经典): Opus-MT (Helsinki-NLP)
理由: 它是目前开源界做离线神经机器翻译(NMT)的标准选择。模型小(~300MB),基于 MarianNMT 框架。
部署: 使用 CTranslate2 库进行推理,它针对 CPU 做了量化(Int8)加速,速度非常快。
推荐方案 2 (大模型量化): Qwen2-0.5B / 1.5B (GGUF)
理由: 如果用 RK3566,可以尝试跑 0.5B 或 1.5B 参数量的通义千问(Qwen)经过 4-bit 量化。虽然翻译质量极高,但推理速度可能是瓶颈(可能 5-10 token/s),会导致声音卡顿。
建议: 优先使用 Opus-MT + CTranslate2。对于翻译机这种单一任务,专用小模型比通用 LLM 更快更稳。
TTS (语音合成):中文
需要“轻量”且“质量好”。传统的 Tacotron 太慢,传统的 Espeak 太难听。
Piper (基于 VITS 架构)
特点: 专为低算力设备设计(树莓派 4 上都能实时)。
模型: 支持中文,生成的语音自然度非常高,接近真人。
部署: 输出 PCM 流直接喂给 I2S 播放。支持 ONNX Runtime。
备选方案: Sherpa-Onnx TTS (VITS / Matcha)
特点: 新一代架构,支持流式合成。不仅轻,而且可以利用 RK3566 的 NPU 加速推理。
常用的指令:
环境搭建部分:
整体环境换源的简易方法,这里我们使用小鱼ROS给出的脚本,其中有快速换源脚本
wget http://fishros.com/install -O fishros&&. fishros
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip换源到清华源
pip install ipykernel 在板卡端安装jupyter环境
同时搭建起vscode的ssh连接,安装jupyter和python扩展插件
在板卡端新建一个.ipynb的文件,选择python内核
wsl2端conda环境的建立:
安装Miniconda即可,需要的包自己安装,节省空间,易于管理环境
创建名为 rknn_dev 的环境,使用Python 3.10
conda create -n rknn_dev python=3.10 -y
激活环境
conda activate rknn_dev
通过在~/.bashrc中加入alias gorknn="conda activate rknn_dev"实现快速环境切换
添加conda的清华源conda config --add channels +channel
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
最后得到的开发环境应该是这样的

声卡部分:
这一部分为硬件部分,主要包括内核的更改以及设备树dtb文件的编译烧录(我已经完成TLV320AIC32X4的内核和设备树了,但是板子让我接反芯片烧了...过几天更新这块,先大体记录一下)
直接在SDK文件夹下执行./build.sh kernel/uboot即可编译内核和uboot,
首先进入kernel文件夹,然后执行
make ARCH=arm64 menuconfig
开启tlv320的声卡驱动,如图

一定记得将更改后的config文件写入选用的配置文件,不然就是白改了
cp .config arch/arm64/configs/lubancat2_defconfig
这样内核就配置完成,已经加入了声卡驱动,之后修改设备树文件,如下图所示,同时加入声卡节点


修改完成后得到boot.img文件和.dtb文件,然后替换掉板卡中的/boot/Image-4.19.232,/boot/dtb/rk3566-lubancat-1.dtb文件,之后sudo reboot即可
(通过直接替换uboot的启动文件来修改内核,这样适合于轻量修改微调设备,比用官方镜像烧录来的方便,且不用在意分区表,也避免系统无法启动的现象)

这样就表示成功识别到了设备
工程文件夹组织:
按照如下进行组织项目

音频识别部分:
这里因为声卡损坏,所以使用板载的声卡来进行声音的录制和播放
声卡信息查看:
arecord -l获取录音设备,麦克风
aplay -l获取播放设备
这里选用板卡自带的rk809声卡(为什么电源芯片可以带麦克风跟耳机?)

配置声卡:
amixer contents -c 1 查看声卡配置信息
amixer -c 1 cset numid=1 2 设置声卡选项值
alsamixer 图形化配置声卡
arecord -D hw:1,0 -f S16_LE -r 16000 -c 2 -d 5 test.wav 测试麦克
aplay -Dhw:1 test.wav 测试播放音频
(耳机声音千万不要开太大...)
参考如下
https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/quick_start/audio/audio.html
模型部署部分:
只需要调用官方给出的api即可使用,官方给出了c++和py的两个版本的库
Toolkit Lite2 主要用于部署 RKNN 模型到板卡,可以通过 RKNN Toolkit2 工具将其他模型转换为
RKNN 模型。Toolkit Lite2 部署 RKNN 模型流程:
• 创建 RKNNLite 对象;
• 调用 load_rknn 接口导入 RKNN 模型,需要对应平台(rk356x/rk3588)的模型;
• 调用 init_runtime 接口初始化运行时环境;
• 调用 inference 接口对输入数据进行推理,返回推理结果,对结果进行处理;
• 推理完成后,调用 release 接口释放 RKNNLite 对象。
RKNN环境搭建:
查看 librknnrt 库版本
strings /usr/lib/librknnrt.so | grep "librknnrt version"
查看 rknn_server 版本
strings /usr/bin/rknn_server | grep build
查看 NPU 驱动版本
dmesg | grep -i rknpu
或者
sudo cat /sys/kernel/debug/rknpu/version
pytorch环境搭建:
原始模型 (PyTorch) -> ONNX -> RKNN
模型的下载:
模型转化:
模型的部署使用:
ollama run hf.co/Qwen/Qwen2.5-Coder-7B-Instruct-GGUF:Q4_K_M
CPP开发环境搭建(基于CLION):
浙公网安备 33010602011771号