Audio_Assistant

0 downloads 0 likes on ModelScope updated

Model card

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 显示 (单文件)。

已知限制

  1. 仅保证 400TAI WL 运行链路, 30TAI/ZG请使用ZG分支。
  2. ASR 固定 500 帧窗口。
  3. asr_encoder 的 GatherElements 依赖 libgatherelements_hostbackend.so,run_cmd_axi.sh 会自动 LD_PRELOAD;缺失时 ASR 会退化到很慢的 host 路径。
  4. TTS 文本当前为固定反馈文本(cfg.param.tts_text),后续可接入实际Action 反馈表。
  5. 本包只提供运行产物;编译配置及编译中间产物不在本包范围内。
  6. 权重与模型来源见 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。