k2-fsa / sherpa-onnx

Speech-to-text, text-to-speech, speaker diarization, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, Raspberry Pi, RISC-V, x86_64 servers, websocket server/client, C/C++, Python, Kotlin, C#, Go, NodeJS, Java, Swift, Dart, JavaScript, Flutter, Object Pascal, Lazarus, Rust
https://k2-fsa.github.io/sherpa/onnx/index.html
Apache License 2.0
3.63k stars 424 forks source link

请问可以在c-api-examples里提供一个keyword spotting的例子吗? #1221

Open PeiwenWu opened 3 months ago

csukuangfj commented 3 months ago

请自己根据 c++/python/javascript/c# 等中的 keyword spotting 例子,自己加一个 c api 的例子。 如果你自己在加的过程中,有任何的问题,可以随时贴出来。

PeiwenWu commented 3 months ago

目前感觉无从下手,请问如果参考c++的例子,参考哪个代码文件比较好呢? 您可以推荐一下吗?

pkufool commented 3 months ago

目前感觉无从下手,请问如果参考c++的例子,参考哪个代码文件比较好呢? 您可以推荐一下吗?

就按照接口,需要什么参数给什么参数。 参考 ASR,相似度非常高 https://github.com/k2-fsa/sherpa-onnx/blob/master/c-api-examples/decode-file-c-api.c 或者这个 https://github.com/k2-fsa/sherpa-onnx/tree/master/c-api-examples/asr-microphone-example

endink commented 5 hours ago

@PeiwenWu 来晚了,最近才开始用这个库,我想大概长这样,这是我代码里的片段拼凑的。

//加载模型

_spotter = SherpaOnnxCreateKeywordSpotter(_config.get());

SherpaOnnxKeywordSpotter* _spotter;
//1. 打开
auto stream = SherpaOnnxCreateKeywordStream(_spotter);

//2. 传入语音
bool ok = false;
SherpaOnnxOnlineStreamAcceptWaveform(stream, _config->feat_config.sample_rate, reinterpret_cast<const float*>(samples), samples_len);
//SherpaOnnxOnlineStreamInputFinished(_stream);
if (SherpaOnnxIsKeywordStreamReady(_spotter, stream) == 1) {
    SherpaOnnxDecodeKeywordStream(_spotter, stream);
    auto* result = SherpaOnnxGetKeywordResult(_spotter, stream);

    ok = result && result->keyword != nullptr;
    if (ok) {
        LOG_INFO("Wake up by key words: %s", result->keyword);
    }
    if (result) {
        SherpaOnnxDestroyKeywordResult(result);
    }
}

//3. 关闭
SherpaOnnxDestroyOnlineStream(stream);

//卸载模型
SherpaOnnxDestroyKeywordSpotter(_spotter);
_spotter = nullptr;

唯一不确定的是这个 SherpaOnnxOnlineStreamInputFinished 这是我看 bin 代码里的,我需要连续监测这里是不是不能 finished, 注释说调用了之后就不能 accept.

因为我发现没有办法生成唤醒词 token, 暂时没用这些代码,也就没有测试, 参考已经足够。希望可以帮到你。