wangdbff 发表于 2026-10-24 20:50:36

【欧时RS x Arduino】部署离线语音识别ASR

      最初想用官方 App Lab 的 CloudASR 例程做语音识别,结果发现需要填写API KEY,这个KEY需要用原厂库支持的平台才可以。所以放弃官方例程,

按照上次探索的方式,直接在Linux侧部署离线模型。
   第一个遇到的麻烦是怎么添加麦克风。查看资料发现可以在扩展接口使用带麦的耳机直接连接模拟接口,也可以使用USB接口的麦克风。这么看肯定是直接
插个usb的方便,那么就会遇到下一个坑,板子就一个USB-C口,且用它供电默认就是device模式。用外部供电他又不会自己切换到主机模式。好在找到用户手册

    按照这个短接了引脚,结果还是不行,测试发现HUB压根就没供电,那么就是UNO Q虽然USB工作在了主机模式但没有提供对完供电。所以,HUB还要支持外部供电。
   解决供电问题,发现lsusb还是啥都没有,又问了问AI,才意识到,这几个typec口得注意接插顺序,这样工作模式才能正确。也就是,先给hub供上电,再接到UNO Q的
USB口,这次就通了。
    使用这两个命令查看USB识别结果。
lsusb
arecord -l   
      接下来就安装必要依赖
      
sudo apt update
sudo apt install -y alsa-utils ffmpeg      安装 Vosk pip3 install vosk --break-system-packages   下载中文模型

mkdir -p ~/asr && cd ~/asr
wget https://alphacephei.com/vosk/models/vosk-model-small-cn-0.22.zip
unzip vosk-model-small-cn-0.22.zip
mv vosk-model-small-cn-0.22 model-cn   整个python测试一下

#!/usr/bin/env python3
# offline_asr.py
import json, subprocess, sys

try:
    from vosk import Model, KaldiRecognizer
except ImportError:
    print("pip install vosk"); sys.exit(1)

MODEL_PATH = "/home/arduino/asr/model-cn"
MIC_DEV    = "plughw:1,0"
RATE       = 16000
CHUNK      = 4000

def main():
    model = Model(MODEL_PATH)
    rec = KaldiRecognizer(model, RATE)
    rec.SetWords(False)

    # arecord 输出 PCM 裸流
    cmd = ["arecord", "-q", "-D", MIC_DEV,
         "-f", "S16_LE", "-r", str(RATE), "-c", "1", "-t", "raw"]
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0)

    print("离线识别中... 说 '停止' 退出")
    try:
      while True:
            data = proc.stdout.read(CHUNK)
            if not data: continue

            if rec.AcceptWaveform(data):
                res = json.loads(rec.Result())
                text = res.get("text", "").strip()
                if text:
                  print(f"[最终] {text}")
                  # 串口发给 MCU(可选)
                  # with open("/dev/ttyACM0","w") as f: f.write(text+"\n")
                  if "停止" in text: break
            else:
                par = json.loads(rec.PartialResult()).get("partial","")
                if par: print(f"\r[临时] {par}", end="", flush=True)
    except KeyboardInterrupt:
      pass
    finally:
      proc.terminate()

if __name__ == "__main__":
    main()    对着麦克风近一点说句话:你好, Arduino!
   
      嗯,还行,基本能认出来。
页: [1]
查看完整版本: 【欧时RS x Arduino】部署离线语音识别ASR

Baidu
map