From 9129afcc995cb521b361b6a4f3572f248c6bafec Mon Sep 17 00:00:00 2001 From: Del Wang Date: Sat, 10 May 2025 12:55:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20kws=20=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/kws/README.md | 27 +++++++++++++----- examples/kws/debug.sh | 64 ++++++++++++++++++++++++++++++++++++++++++ examples/kws/init.sh | 2 +- 3 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 examples/kws/debug.sh diff --git a/examples/kws/README.md b/examples/kws/README.md index 885789b..da39ff0 100644 --- a/examples/kws/README.md +++ b/examples/kws/README.md @@ -5,7 +5,6 @@ 小爱音箱自定义唤醒词,基于 [sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx)。 - ## 快速开始 > [!NOTE] @@ -103,16 +102,24 @@ EOF ## 常见问题 -### Q:能否自定义唤醒词的响应动作?比如:关灯 - -该脚本默认不支持自定义唤醒词触发后执行的动作。 - -如果你想要自定义唤醒词的触发动作,可以参考 [open-xiaoai](https://github.com/idootop/open-xiaoai) 里的其他演示程序,根据 server 端接收到的小爱音箱上的唤醒词事件,实时触发任意自定义操作(比如:打电话,订外卖等)。 - ### Q:为什么唤醒词识别不是很灵敏,时好时坏? 由于小爱音箱 client 端算力和存储空间有限,默认只使用了一个较小的语音识别模型,所以识别效果并不是很完美,需要多多尝试。 +你可以在小爱音箱上运行以下调试脚本,根据语音识别结果,动态调整唤醒词拼音。 + +```shell +# 运行调试脚本 +curl -sSfL https://gitee.com/idootop/artifacts/releases/download/open-xiaoai-kws/debug.sh | sh + +# 🐢 模型加载较慢,请在提示 Started! Please speak 后,再使用自定义唤醒词 +# Started! Please speak +# 0:tiānmāojīnglián 👈 天猫精灵 +# 1:xiǎodùxiǎodù 👈 小度小度 +# 2:dōubāodùba 👈 豆包豆包 +# 3:nǐhǎoxiǎozhī 👈 你好小智 +``` + 如果你想要更完美的唤醒词识别效果,可以在 server 端运行更大规模、更先进的 AI 模型,来进行唤醒词识别。推荐使用 [FunASR](https://github.com/modelscope/FunASR) 和 [Sherpa-ONNX](https://github.com/k2-fsa/sherpa-onnx),可以参考 [xiaozhi-esp32-server](https://github.com/xinnan-tech/xiaozhi-esp32-server) 项目。 ### Q:能不能设置英文/方言作为唤醒词?比如:Siri @@ -126,3 +133,9 @@ EOF 由于小爱音箱 client 端算力和存储空间有限,默认只使用了一个较小的语音识别模型,并不支持说话人识别等高阶功能。 如果你需要声纹识别、连续对话等高阶功能,可以在 server 端运行更大规模、更先进的 AI 模型,来进行语音识别和对话管理。推荐使用 [FunASR](https://github.com/modelscope/FunASR) 和 [Sherpa-ONNX](https://github.com/k2-fsa/sherpa-onnx),可以参考 [xiaozhi-esp32-server](https://github.com/xinnan-tech/xiaozhi-esp32-server) 项目。 + +### Q:能否自定义唤醒词的响应动作?比如:关灯 + +该脚本默认不支持自定义唤醒词触发后执行的动作。 + +如果你想要自定义唤醒词的触发动作,可以参考 [open-xiaoai](https://github.com/idootop/open-xiaoai) 里的其他演示程序,根据 server 端接收到的小爱音箱上的唤醒词事件,实时触发任意自定义操作(比如:打电话,订外卖等)。 \ No newline at end of file diff --git a/examples/kws/debug.sh b/examples/kws/debug.sh new file mode 100644 index 0000000..4f732c5 --- /dev/null +++ b/examples/kws/debug.sh @@ -0,0 +1,64 @@ +#! /bin/sh + +set -e + +MIN_SPACE_MB=32 +DOWNLOAD_BASE_URL="https://gitee.com/idootop/artifacts/releases/download/open-xiaoai-kws" + + +check_disk_space() { + local space_kb=$(df -k "$1" | awk 'NR==2 {print $4}') + if [ $((space_kb / 1024)) -lt "$MIN_SPACE_MB" ]; then + echo 1 + else + echo 0 + fi +} + + +BASE_DIR="/data" +if [ $(check_disk_space "$BASE_DIR") -eq 1 ]; then + BASE_DIR="/tmp" + if [ $(check_disk_space "$BASE_DIR") -eq 1 ]; then + echo "❌ 磁盘空间不足,请先清理磁盘空间(至少需要 $MIN_SPACE_MB MB 空间)" + exit 1 + fi +fi + + +WORK_DIR="$BASE_DIR/open-xiaoai/kws" +KWS_DEBUG_BIN="$WORK_DIR/kws-debug" + +if [ ! -d "$WORK_DIR" ]; then + mkdir -p "$WORK_DIR" +fi + +if [ ! -f "$WORK_DIR/models/encoder.onnx" ]; then + echo "🔥 正在下载模型文件..." + curl -L -# -o "$WORK_DIR/kws.tar.gz" "$DOWNLOAD_BASE_URL/kws.tar.gz" + tar -xzvf "$WORK_DIR/kws.tar.gz" -C "$WORK_DIR" + rm "$WORK_DIR/kws.tar.gz" + echo "✅ 模型文件下载完毕" +fi + +if [ ! -f "$KWS_DEBUG_BIN" ]; then + echo "🔥 正在下载 kws-debug 文件..." + curl -L -# -o "$KWS_DEBUG_BIN" "$DOWNLOAD_BASE_URL/kws-debug" + chmod +x "$KWS_DEBUG_BIN" + echo "✅ kws-debug 文件下载完毕" +fi + +echo "🔥 正在启动唤醒词识别调试服务,请耐心等待..." +echo "🐢 模型加载较慢,请在提示 Started! Please speak 后,再使用自定义唤醒词" + +kill -9 `ps|grep "open-xiaoai/kws/kws-debug"|grep -v grep|awk '{print $1}'` > /dev/null 2>&1 || true +"$KWS_DEBUG_BIN" \ + --model-type=zipformer2 \ + --tokens="$WORK_DIR/models/tokens.txt" \ + --encoder="$WORK_DIR/models/encoder.onnx" \ + --decoder="$WORK_DIR/models/decoder.onnx" \ + --joiner="$WORK_DIR/models/joiner.onnx" \ + --provider=cpu \ + --num-threads=1 \ + --chunk-size=1024 \ + noop diff --git a/examples/kws/init.sh b/examples/kws/init.sh index d281ffe..896370b 100644 --- a/examples/kws/init.sh +++ b/examples/kws/init.sh @@ -33,7 +33,7 @@ if [ ! -d "$WORK_DIR" ]; then mkdir -p "$WORK_DIR" fi -if [ ! -f "$WORK_DIR/kws" ]; then +if [ ! -f "$WORK_DIR/models/encoder.onnx" ]; then echo "🔥 正在下载模型文件..." curl -L -# -o "$WORK_DIR/kws.tar.gz" "$DOWNLOAD_BASE_URL/kws.tar.gz" tar -xzvf "$WORK_DIR/kws.tar.gz" -C "$WORK_DIR"