Audio_Assistant
离线语音助手参考工程:VAD + KWS + ASR + TTS 四类模型,在 400TAI(WL / wl170) 上通过 AXI 完成:
PCM(16k, mono, float32)
-> VAD(silero-vad, onnxruntime)
-> KWS(zipformer, 3s 滑窗唤醒)
-> VAD 切命令段
-> ASR(conformer, b16 joiner + asr_encoder_500)
-> orange_command 匹配(command/intent/family/slot)
-> TTS(MeloTTS, 4 子网)
本仓库是部署型模型库,不包含模型导出与 icraft 编译流程;运行所需模型、资源、依赖全部自包含。
支持范围
| 项 | 值 |
|---|---|
| 硬件 | 400TAI / WL170 |
| 板卡示例 | xxx.xxx.xxx.xxx |
| 运行方式 | AXI(Python 直接跑在板上,无需 icraft-serve) |
| icraft | 3.40.1 |
| Python | 3.12(板端 /mnt/audio_env) |
| 默认链路 | audio_assistant_mix_cmd.py |
目录结构
Audio_Assistant/
├── configuration.json
├── README.md
├── deployment.md
├── THIRD_PARTY_NOTICES.md
├── .gitattributes
├── .gitignore
├── melo/ # MeloTTS 文本前端
└── 3_deploy/
├── cfg/
│ └── audio_assistant_WL_fp16_b16_500_axi.yaml
├── imodel/WL/fp16/ # 仅最终 *_WL.json/raw
│ ├── asr_encoder_500/ asr_decoder/ asr_joiner_b16/
│ ├── kws_encoder/ kws_decoder/ kws_joiner_b16/
│ └── tts_text_encoder/ tts_duration_predictor/ tts_flow/ tts_generator/
├── pyrt/
│ ├── audio_assistant_mix.py # 运行时库(IcraftNet/VAD/Transducer/TTS)
│ ├── audio_assistant_mix_batch.py
│ ├── audio_assistant_mix_cmd.py # 对外入口
│ ├── run_cmd_axi.sh
│ └── assets/ # fbank / bbpe / orange_command / embed / tokens / VAD
├── modelzoo_utils/
├── axi_pyenv/ # Python 3.12 aarch64 离线 wheels + nltk_data
├── metrics/
│ └── time_analyze/ # final_timing.json + time_analyze.md
└── io/
├── input/*.wav + list.txt
├── golden/ # 期望结果
└── output/ # 运行生成
环境安装
板端 python3.12:
python3 -m venv /mnt/audio_env
source /mnt/audio_env/bin/activate
cd /home/fmsh/ModelZoo/Audio_Assistant/3_deploy/axi_pyenv
pip install --no-index --find-links=. -r requirements.txt
前置条件:板端已安装与 *_WL.json 匹配的 Icraft_3.40.1_onchip.deb,/usr/lib/aarch64-linux-gnu/libicraft_xir.so、libaxiwl170.so 存在。
快速开始(400TAI AXI)
# 1) 板端环境(只需一次)
source /mnt/audio_env/bin/activate
python -c "import icraft; from icraft import xrt; print('icraft ok')"
# 2) 运行最终链路
cd /home/fmsh/ModelZoo/Audio_Assistant/3_deploy/pyrt
chmod +x run_cmd_axi.sh(仅首次)
./run_cmd_axi.sh
# 3) 只验证 KWS/VAD/ASR/命令匹配(不跑 TTS)
./run_cmd_axi.sh --no-tts
# 4) 指定单条音频
./run_cmd_axi.sh ../io/input/qianjin.wav --no-tts
# 5) 指定板卡 IP
./run_cmd_axi.sh --ip 192.168.125.201
# 6) 耗时
./run_cmd_axi.sh --profile --timing-json ../io/output/cmd_timing.json
板端首次运行会加载 11 个 网络 session,约 71 秒;TTS 首次 clean_text 有一次性初始化开销(约 27s),之后稳态约 1 秒。
输入与输出
- 输入:16 kHz、单声道 wav;默认读取
3_deploy/io/list.txt中的文件名。 - 输出:
3_deploy/io/output/WL_fp16_b16_500_cmd/<wav>.txt和tts_feedback.wav。 - 结果字段:
wake、kws_text、cmd_region、asr、matched(command/intent/family/slot_value)、source。
性能参考(400TAI WL170,AXI)
板端 AXI 实测:
- VAD :约 106ms
- KWS :约 214ms
- ASR:约 246ms
- TTS 4 子网稳态:约 0.91s
以上为 400TAI AXI 实测;复测请以 --timing-json 为准。
耗时树输出
run_cmd_axi.sh 默认打印层级耗时树(百分比相对父节点):
stage:file子树:单文件=实际耗时;多文件=平均耗时/文件stage:init/stage:tts:run/stage:read_cfg:一次性耗时stage:total:本次运行总计
5 文件示例:
stage:total 107399.351 ms (5 文件总计)
├── stage:init 71351.025 ms (一次性, 66.4%)
│ ├── init:tts_flow:load 19889.041 ms (27.9%)
│ ├── init:asr_encoder:load 9774.168 ms (13.7%)
│ ├── init:kws_encoder:load 9561.370 ms (13.4%)
│ ├── init:tts_generator:load 6868.905 ms (9.6%)
│ ├── init:kws_encoder:session 5903.658 ms (8.3%)
│ ├── init:kws_encoder:apply 4231.186 ms (5.9%)
│ ├── init:asr_encoder:apply 3286.180 ms (4.6%)
│ ├── init:tts_flow:apply 2892.856 ms (4.1%)
│ ├── init:asr_encoder:session 2458.172 ms (3.4%)
│ ├── init:tts_generator:apply 1515.070 ms (2.1%)
│ ├── init:tts_text_encoder:load 1512.500 ms (2.1%)
│ ├── init:tts_flow:session 909.160 ms (1.3%)
│ ├── init:tts_text_encoder:apply 775.729 ms (1.1%)
│ ├── init:kws_decoder:load 621.203 ms (0.9%)
│ ├── init:asr_joiner:load 270.424 ms (0.4%)
│ ├── init:tts_text_encoder:session 247.172 ms (0.3%)
│ ├── init:kws_joiner:load 105.394 ms (0.1%)
│ ├── init:tts_generator:session 101.232 ms (0.1%)
│ ├── init:tts_duration_predictor:load 70.214 ms (0.1%)
│ ├── init:tts_duration_predictor:apply 43.994 ms (0.1%)
│ ├── init:vad_onnx 39.524 ms (0.1%)
│ ├── init:asr_decoder:load 39.519 ms (0.1%)
│ ├── init:kws_decoder:apply 35.878 ms (0.1%)
│ ├── init:asr_joiner:apply 28.509 ms (0.0%)
│ ├── init:kws_joiner:apply 17.361 ms (0.0%)
│ ├── init:asr_decoder:apply 8.525 ms (0.0%)
│ ├── init:tts_duration_predictor:session 6.738 ms (0.0%)
│ ├── init:asr_joiner:session 1.829 ms (0.0%)
│ ├── init:kws_decoder:session 1.758 ms (0.0%)
│ ├── init:kws_joiner:session 1.628 ms (0.0%)
│ ├── init:asr_decoder:session 1.601 ms (0.0%)
│ ├── init:kws_encoder:path 0.754 ms (0.0%)
│ ├── init:tts_generator:path 0.454 ms (0.0%)
│ ├── init:asr_decoder:path 0.453 ms (0.0%)
│ ├── init:tts_flow:path 0.437 ms (0.0%)
│ ├── init:kws_decoder:path 0.420 ms (0.0%)
│ ├── init:tts_duration_predictor:path 0.408 ms (0.0%)
│ ├── init:kws_joiner:path 0.391 ms (0.0%)
│ ├── init:asr_encoder:path 0.387 ms (0.0%)
│ ├── init:tts_text_encoder:path 0.383 ms (0.0%)
│ ├── init:asr_joiner:path 0.377 ms (0.0%)
│ ├── init:device_reset:wl170 0.091 ms (0.0%)
│ └── 其他/未单独打点 125.973 ms (0.2%)
├── stage:tts:run 27620.232 ms (一次性, 25.7%)
│ ├── pre:tts:ids 26652.036 ms (96.5%)
│ │ ├── pre:tts:clean_text 26648.277 ms (100.0%)
│ │ ├── pre:tts:import 3.677 ms (0.0%)
│ │ └── pre:tts:ids_build 0.045 ms (0.0%)
│ ├── tts_flow 569.760 ms (2.1%)
│ │ ├── net:tts_flow 566.449 ms (99.4%)
│ │ ├── pre:tts_flow:input 3.195 ms (0.6%)
│ │ ├── post:tts_flow:to_numpy 0.065 ms (0.0%)
│ │ └── post:tts_flow:reset 0.051 ms (0.0%)
│ ├── tts_generator 285.497 ms (1.0%)
│ │ ├── net:tts_generator 282.201 ms (98.8%)
│ │ ├── pre:tts_generator:input 3.135 ms (1.1%)
│ │ ├── post:tts_generator:to_numpy 0.114 ms (0.0%)
│ │ └── post:tts_generator:reset 0.048 ms (0.0%)
│ ├── glue:tts:dp2flow 56.438 ms (0.2%)
│ ├── tts_text_encoder 45.447 ms (0.2%)
│ │ ├── net:tts_text_encoder 36.837 ms (81.1%)
│ │ ├── pre:tts_text_encoder:input 8.457 ms (18.6%)
│ │ ├── post:tts_text_encoder:to_numpy 0.100 ms (0.2%)
│ │ └── post:tts_text_encoder:reset 0.053 ms (0.1%)
│ ├── tts_duration_predictor 4.975 ms (0.0%)
│ │ ├── net:tts_duration_predictor 2.908 ms (58.5%)
│ │ ├── pre:tts_duration_predictor:input 1.963 ms (39.4%)
│ │ ├── post:tts_duration_predictor:to_numpy 0.062 ms (1.2%)
│ │ └── post:tts_duration_predictor:reset 0.042 ms (0.9%)
│ ├── pre:tts:inputs 1.362 ms (0.0%)
│ └── post:tts:trim 0.970 ms (0.0%)
├── stage:file 1664.716 ms (5 文件平均)
│ ├── stage:kws:wake_scan 754.341 ms (45.3%)
│ │ ├── stage:kws:encode 185.895 ms (24.6%)
│ │ │ ├── net:kws_encoder 169.680 ms (91.3%)
│ │ │ ├── pre:kws:fbank 14.952 ms (8.0%)
│ │ │ ├── pre:kws_encoder:input 0.775 ms (0.4%)
│ │ │ ├── post:kws_encoder:to_numpy 0.059 ms (0.0%)
│ │ │ ├── post:kws_encoder:reset 0.041 ms (0.0%)
│ │ │ ├── post:kws:enc_reshape 0.023 ms (0.0%)
│ │ │ └── 其他/未单独打点 0.366 ms (0.2%)
│ │ ├── stage:kws:greedy 77.339 ms (10.3%)
│ │ │ ├── net:kws_joiner 24.214 ms (11.8 次/文件, 2.052 ms/次, 31.3%)
│ │ │ ├── net:kws_decoder 19.936 ms (11.0 次/文件, 1.812 ms/次, 25.8%)
│ │ │ ├── pre:kws_joiner:input 9.421 ms (11.8 次/文件, 0.798 ms/次, 12.2%)
│ │ │ ├── pre:kws_decoder:input 5.830 ms (11.0 次/文件, 0.530 ms/次, 7.5%)
│ │ │ ├── glue:kws:dec_embed 1.341 ms (11.0 次/文件, 0.122 ms/次, 1.7%)
│ │ │ ├── post:kws_joiner:to_numpy 0.696 ms (11.8 次/文件, 0.059 ms/次, 0.9%)
│ │ │ ├── post:kws_decoder:to_numpy 0.601 ms (11.0 次/文件, 0.055 ms/次, 0.8%)
│ │ │ ├── post:kws_joiner:reset 0.465 ms (11.8 次/文件, 0.039 ms/次, 0.6%)
│ │ │ ├── post:kws_decoder:reset 0.388 ms (11.0 次/文件, 0.035 ms/次, 0.5%)
│ │ │ ├── post:kws:dec_reshape 0.164 ms (11.0 次/文件, 0.015 ms/次, 0.2%)
│ │ │ └── 其他/未单独打点 14.283 ms (18.5%)
│ │ ├── post:kws:tokens 0.105 ms (0.0%)
│ │ └── 其他/未单独打点 491.003 ms (65.1%)
│ ├── stage:asr 300.637 ms (18.1%)
│ │ ├── stage:asr:encode 210.117 ms (69.9%)
│ │ │ ├── net:asr_encoder 195.037 ms (92.8%)
│ │ │ ├── pre:asr:fbank 13.588 ms (6.5%)
│ │ │ ├── pre:asr_encoder:input 0.994 ms (0.5%)
│ │ │ ├── post:asr_encoder:to_numpy 0.061 ms (0.0%)
│ │ │ ├── post:asr_encoder:reset 0.043 ms (0.0%)
│ │ │ ├── post:asr:enc_reshape 0.023 ms (0.0%)
│ │ │ └── 其他/未单独打点 0.371 ms (0.2%)
│ │ ├── stage:asr:greedy 90.428 ms (30.1%)
│ │ │ ├── net:asr_joiner 35.683 ms (14.4 次/文件, 2.478 ms/次, 39.5%)
│ │ │ ├── net:asr_decoder 15.672 ms (9.8 次/文件, 1.599 ms/次, 17.3%)
│ │ │ ├── pre:asr_joiner:input 11.759 ms (14.4 次/文件, 0.817 ms/次, 13.0%)
│ │ │ ├── pre:asr_decoder:input 5.547 ms (9.8 次/文件, 0.566 ms/次, 6.1%)
│ │ │ ├── glue:asr:dec_embed 1.270 ms (9.8 次/文件, 0.130 ms/次, 1.4%)
│ │ │ ├── post:asr_joiner:to_numpy 0.915 ms (14.4 次/文件, 0.064 ms/次, 1.0%)
│ │ │ ├── post:asr_joiner:reset 0.652 ms (14.4 次/文件, 0.045 ms/次, 0.7%)
│ │ │ ├── post:asr_decoder:to_numpy 0.556 ms (9.8 次/文件, 0.057 ms/次, 0.6%)
│ │ │ ├── post:asr_decoder:reset 0.359 ms (9.8 次/文件, 0.037 ms/次, 0.4%)
│ │ │ ├── post:asr:dec_reshape 0.139 ms (9.8 次/文件, 0.014 ms/次, 0.2%)
│ │ │ └── 其他/未单独打点 17.876 ms (19.8%)
│ │ └── post:asr:tokens 0.045 ms (0.0%)
│ ├── stage:vad 119.733 ms (7.2%)
│ │ ├── net:vad_onnx 105.692 ms (86.0 次/文件, 1.229 ms/次, 88.3%)
│ │ ├── post:vad_onnx:state 4.587 ms (86.0 次/文件, 0.053 ms/次, 3.8%)
│ │ ├── pre:vad_onnx:input 2.097 ms (86.0 次/文件, 0.024 ms/次, 1.8%)
│ │ ├── post:vad_onnx:to_numpy 0.919 ms (86.0 次/文件, 0.011 ms/次, 0.8%)
│ │ └── 其他/未单独打点 6.437 ms (5.4%)
│ ├── glue:vad:segments 0.182 ms (0.0%)
│ └── 其他/未单独打点 489.824 ms (29.4%)
├── stage:read_cfg 19.786 ms (一次性, 0.0%)
├── io:write_result 3.698 ms (5 次, 0.740 ms/次, 0.0%)
├── io:tts_wav 2.939 ms (0.0%)
└── 其他/未单独打点 78.091 ms (0.1%)
单文件运行时 stage:file 显示 (单文件)。
已知限制
- 仅保证 400TAI WL 运行链路, 30TAI/ZG请使用
ZG分支。 - ASR 固定 500 帧窗口。
asr_encoder的GatherElements依赖libgatherelements_hostbackend.so,run_cmd_axi.sh会自动LD_PRELOAD;缺失时 ASR 会退化到很慢的 host 路径。- TTS 文本当前为固定反馈文本(
cfg.param.tts_text),后续可接入实际Action 反馈表。 - 本包只提供运行产物;编译配置及编译中间产物不在本包范围内。
- 权重与模型来源见
THIRD_PARTY_NOTICES.md。
模型来源
-
VAD:silero-vad
-
KWS:sherpa-onnx zipformer zh-en 2023-11-22
-
ASR:WenetSpeech pruned_transducer_stateless5
-
TTS:MeloTTS-Chinese(VITS2)
第三方许可见
THIRD_PARTY_NOTICES.md。