chore: kws 测试

This commit is contained in:
Del Wang
2025-05-08 00:24:55 +08:00
parent 62c7c88eab
commit e3732a7f1c
3 changed files with 17 additions and 11 deletions
+9 -7
View File
@@ -26,13 +26,13 @@ if [ $(check_disk_space "$BASE_DIR") -eq 1 ]; then
fi fi
WORK_DIR="$BASE_DIR/open-xiaoai" WORK_DIR="$BASE_DIR/open-xiaoai/kws"
if [ ! -d "$WORK_DIR" ]; then if [ ! -d "$WORK_DIR" ]; then
mkdir -p "$WORK_DIR" mkdir -p "$WORK_DIR"
fi fi
if [ ! -f "$WORK_DIR/kws/kws" ]; then if [ ! -f "$WORK_DIR/kws" ]; then
echo "🔥 正在下载模型文件..." echo "🔥 正在下载模型文件..."
curl -L -# -o "$WORK_DIR/kws.tar.gz" https://gitee.com/idootop/artifacts/releases/download/open-xiaoai-kws/kws.tar.gz curl -L -# -o "$WORK_DIR/kws.tar.gz" https://gitee.com/idootop/artifacts/releases/download/open-xiaoai-kws/kws.tar.gz
tar -xzvf "$WORK_DIR/kws.tar.gz" -C "$WORK_DIR" tar -xzvf "$WORK_DIR/kws.tar.gz" -C "$WORK_DIR"
@@ -42,12 +42,14 @@ fi
echo "🔥 正在启动唤醒词识别服务..." echo "🔥 正在启动唤醒词识别服务..."
"$WORK_DIR/kws/kws" \ chmod +x "$WORK_DIR/kws"
"$WORK_DIR/kws" \
--model-type=zipformer2 \ --model-type=zipformer2 \
--tokens="$WORK_DIR/kws/models/tokens.txt" \ --tokens="$WORK_DIR/models/tokens.txt" \
--encoder="$WORK_DIR/kws/models/encoder.onnx" \ --encoder="$WORK_DIR/models/encoder.onnx" \
--decoder="$WORK_DIR/kws/models/decoder.onnx" \ --decoder="$WORK_DIR/models/decoder.onnx" \
--joiner="$WORK_DIR/kws/models/joiner.onnx" \ --joiner="$WORK_DIR/models/joiner.onnx" \
--keywords-file="/data/open-xiaoai/kws/keywords.txt" \ --keywords-file="/data/open-xiaoai/kws/keywords.txt" \
--provider=cpu \ --provider=cpu \
--num-threads=1 \ --num-threads=1 \
+3
View File
@@ -57,6 +57,9 @@ class OpenXiaoAIEngine extends MiGPTEngine {
timestamp: Date.now(), timestamp: Date.now(),
}); });
} }
} else if (e.event === "kws") {
const keyword = e.data;
console.log("🔥 唤醒词识别", keyword);
} }
}; };
@@ -1,5 +1,5 @@
use std::future::Future; use std::future::Future;
use std::sync::atomic::{AtomicI32, Ordering}; use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc; use std::sync::Arc;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@@ -18,7 +18,7 @@ pub struct KwsMonitor;
static KWS_FILE_PATH: &str = "/tmp/open-xiaoai/kws.log"; static KWS_FILE_PATH: &str = "/tmp/open-xiaoai/kws.log";
static LAST_TIMESTAMP: AtomicI32 = AtomicI32::new(0); static LAST_TIMESTAMP: AtomicU64 = AtomicU64::new(0);
impl KwsMonitor { impl KwsMonitor {
pub async fn start<F, Fut>(on_update: F) pub async fn start<F, Fut>(on_update: F)
@@ -32,8 +32,8 @@ impl KwsMonitor {
let on_update = Arc::clone(&on_update); let on_update = Arc::clone(&on_update);
async move { async move {
if let FileMonitorEvent::NewLine(content) = event { if let FileMonitorEvent::NewLine(content) = event {
let data = content.split(' ').collect::<Vec<&str>>(); let data = content.split('@').collect::<Vec<&str>>();
let timestamp = data[0].parse::<i32>().unwrap(); let timestamp = data[0].parse::<u64>().unwrap();
let keyword = data[1].to_string(); let keyword = data[1].to_string();
let last_timestamp = LAST_TIMESTAMP.load(Ordering::Relaxed); let last_timestamp = LAST_TIMESTAMP.load(Ordering::Relaxed);
if timestamp != last_timestamp { if timestamp != last_timestamp {
@@ -53,6 +53,7 @@ impl KwsMonitor {
} }
pub async fn stop() { pub async fn stop() {
LAST_TIMESTAMP.store(0, Ordering::Relaxed);
FileMonitor::instance().stop(KWS_FILE_PATH).await; FileMonitor::instance().stop(KWS_FILE_PATH).await;
} }
} }