k2-fsa / sherpa-ncnn

Real-time speech recognition using next-gen Kaldi with ncnn without Internet connection. Support iOS, Android, Raspberry Pi, VisionFive2, LicheePi4A etc.
https://k2-fsa.github.io/sherpa/ncnn/index.html
Apache License 2.0
902 stars 138 forks source link

Can not recognize the audio stream correctly in demo #296

Open hzgdeerHo opened 6 months ago

hzgdeerHo commented 6 months ago

why this model always fail to recognize this audio normally! # the script is "1.01 的十次方等于多少,1.02 的十次方等于多少.。。。1.09 的十次方等于多少",always lost some information as follows: f652bdfd5f2762af654db12b6788e4b

csukuangfj commented 6 months ago

please describe which apk you are using and what phone you are using.

csukuangfj commented 6 months ago

It works perfectly on my Xiaomi 10 with the following model.

https://github.com/k2-fsa/sherpa-ncnn/releases/download/v2.1.5/sherpa-ncnn-2.1.5-cpu-arm64-v8a-bilingual-en-zh.apk

668e3f18bb0f0fb62cd608980e01df95

hzgdeerHo commented 6 months ago

Huawei Mate 30 5G. And always got some incorrect recognition , If I used if (model.isEndpoint()) { model.reset().
But if (model.isEndpoint()) { model.reset(true).. It will be better ,but sometime I got app cracked and exit with .so file failed.

hzgdeerHo commented 6 months ago

THANKS

csukuangfj commented 6 months ago

Have you tried https://github.com/k2-fsa/sherpa-ncnn/issues/296#issuecomment-1889062148

hzgdeerHo commented 6 months ago

I tried in Xiaomi PAD , 0cd02a5303b42845dd6e1692367600b

csukuangfj commented 6 months ago

普通话标准不?

hzgdeerHo commented 6 months ago

会漏话,漏了很多话,没有识别出来。然后if (model.isEndpoint()) { model.reset().

还是: But if (model.isEndpoint()) { model.reset(true) 比较合适?很严重,你给的版本更严重CPU版本的可能,漏了很多语音没有识别出来

hzgdeerHo commented 6 months ago

https://github.com/k2-fsa/sherpa-ncnn/assets/145191076/a52d9597-0e47-45b1-947c-79475523a37e

hzgdeerHo commented 6 months ago

感谢!

csukuangfj commented 6 months ago

不需要你改代码,你直接用我们的 apk, 也会有问题?

csukuangfj commented 6 months ago

https://github.com/k2-fsa/sherpa-ncnn/assets/5284924/0f92b8fb-3511-47ee-820e-62501e5d400b

还真有可能是你发音的问题

csukuangfj commented 6 months ago

你换个人测试下?

hzgdeerHo commented 6 months ago

直接使用你的原装APP,也不行,有可能你的算法中存在VAD检测导致的话头经常不被识别

hzgdeerHo commented 6 months ago

别人测试的效果更不好

hzgdeerHo commented 6 months ago

我发现有个2022年的模型不会出现这个问题,但是,识别的精准度很差。if (model.isEndpoint()) { model.reset().这种方式重置,识别的明显不能用。But if (model.isEndpoint()) { model.reset(true) 还是可以用。十个句子有两个有问题。

csukuangfj commented 6 months ago

https://github.com/k2-fsa/sherpa-ncnn/assets/5284924/0f92b8fb-3511-47ee-820e-62501e5d400b

还真有可能是你发音的问题

这个是我用你的音频,和我自己的声音测试的,你看下?

hzgdeerHo commented 6 months ago

是说录音的测试效果不好?

csukuangfj commented 6 months ago

复现不了你的问题

hzgdeerHo commented 5 months ago

还有个问题请教,发现安卓应用重启多次以后,这个语音识别库出现各种异常,应该如何释放资源?谢谢2024-01-17 22:30:46.512 31274-31970 libc ID_main_service.ID_main_service A Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x7475700070 in tid 31970 (Thread-29), pid 31274 (ID_main_service) 2024-01-17 22:30:47.010 32052-32052 DEBUG pid-32052 A Cmdline: ID_main_service.ID_main_service 2024-01-17 22:30:47.010 32052-32052 DEBUG pid-32052 A pid: 31274, tid: 31970, name: Thread-29 >>> ID_main_service.ID_main_service <<< 2024-01-17 22:30:47.011 32052-32052 DEBUG pid-32052 A #00 pc 000000000003f1c8 /data/app/~~PJr3mO54jYku3hTzLKENXg==/ID_main_service.ID_main_service-Qa6Ge7x-1Gr2j0r1HyK9Ow==/lib/arm64/libsherpa-ncnn-core.so (sherpa_ncnn::Recognizer::Impl::DecodeStream(sherpa_ncnn::Stream*) const+648) (BuildId: a28af39c272d913a8b43ec9f186239e49434bce4) 2024-01-17 22:30:47.011 32052-32052 DEBUG pid-32052 A #03 pc 0000000000002ae8 /data/data/ID_main_service.ID_main_service/code_cache/.overlay/base.apk/classes3.dex (com.k2fsa.sherpa.ncnn.SherpaNcnn.decode+4) 2024-01-17 22:30:47.045 31274-31274 TopResumed...ChangeItem ID_main_service.ID_main_service I execute start, ActivityClientRecord = ActivityRecord{c7abb63 token=android.os.BinderProxy@8321196 {ID_main_service.ID_main_service/com.example.hzg_test.MainActivity}} ---------------------------- PROCESS ENDED (31274) for package ID_main_service.ID_main_service ---------------------------- 2024-01-17 22:30:47.493 2532-2914 DollieAdapterService pid-2532 E notifyActivityState pkg:ID_main_service.ID_main_service/com.example.hzg_test.MainActivity state:19 fg:false mUid:10532 2024-01-17 22:30:47.536 1554-2891 AppOps pid-1554 E Operation not started: uid=10532 pkg=ID_main_service.ID_main_service(null) op=RECORD_AUDIO 2024-01-17 22:30:47.557 1554-3109 AppOps pid-1554 E Operation not started: uid=10532 pkg=ID_main_service.ID_main_service(null) op=RECORD_AUDIO

然后就APP闪退?可能是什么原因?销毁资源,重置模型,等各种方法都试过,结果还是一样。我的语音识别是一直在运行的
csukuangfj commented 5 months ago

你有修改什么代码么?跑的是我们提供的 apk ,还是你自己用我们的 api 去跑的?

如果你用你自己的代码,你是如何写的呢?

hzgdeerHo commented 5 months ago

没有修改源码,但是不知道为什么,在app中重启几次后,就出现这个问题

csukuangfj commented 5 months ago

2024-01-17 22:30:47.493 2532-2914 DollieAdapterService pid-2532 E notifyActivityState pkg:ID_main_service.ID_main_service/com.example.hzg_test.MainActivity state:19 fg:false mUid:10532

com.example.hzg_test.MainActivity

这个不是我们 apk 里面的 tag, 如果你没修改代码而是直接使用我们的 apk 的话,不应该出现这个 log.

hzgdeerHo commented 5 months ago

找到原因了,是因为资源没有释放干净,还有一个疑问如何给这个开源项目增加词汇表,比如成语什么的,例如朝三暮四?

csukuangfj commented 5 months ago

找到原因了,是因为资源没有释放干净

是哪个地方?请贴一下代码,我们也好 fix 一下,避免后来的人碰到你这个问题。

hzgdeerHo commented 5 months ago

我现在没有修改音频识别的代码,是我的线程同时两个以上在进行音频识别导致,线程中包括了对音频的识别,重启APP的时候,有时候线程没有释放干净。

csukuangfj commented 5 months ago

好吧。我是看明白了。

我理解的没改代码,是你用我们提供的代码,不做任何改动。这里的不做任何改动,是指跑我们 master 的代码

你们是把我们提供的代码用到了你们的项目里,这个也算是有改动了。

hzgdeerHo commented 5 months ago

是的,谢谢!

hzgdeerHo commented 5 months ago

还有一个疑问如何给这个开源项目增加词汇表,比如成语什么的,例如朝三暮四?

csukuangfj commented 5 months ago

你看 tokens.txt, 都是单个的字。不需要你加的。

你现在是碰到什么问题了吗?

csukuangfj commented 5 months ago

直接使用你的原装APP,也不行,有可能你的算法中存在VAD检测导致的话头经常不被识别

这个再确认下,你用我们的 apk 直接跑,也不行?

hzgdeerHo commented 5 months ago

用你们的APK,直接大声说话可以,稍微放松音量常常话头就没有了。鲁棒性感觉不好。第二如果不增加释放代码的话在应用内重启APP资源释放不掉,尝试以下代码,闪退不断: private fun restartApp() { // 释放模型资源 model.inputFinished() // model.finalize()

    audioRecord?.stop()
    audioRecord?.release()
    audioRecord = null

    // 停止后台线程
    isRecording = false
    recordingThread?.join()
    recordingThread = null

    model.finalize()

    // 清理其他资源(如果有)

    // 结束当前活动并重启
    finish()
    val intent = Intent(this, MainActivity::class.java)
    startActivity(intent)
}###如果不释放资源重启几次后,内存会占到很高的水平,谢谢!
hzgdeerHo commented 5 months ago

这个是原始代码加了重启APP的情况,多次重启以后,native的内存释放不了 ![Uploading image.png…]()

hzgdeerHo commented 5 months ago

解决了。如果把整个音频识别对象放在线程中,那么重启的时候可以直接释放线程资源,并把音频识别器的资源顺便释放。如果音频识别器放在主线程中,那么重启的时候无法使用model.finalize()释放内存,问题就不好办。

hzgdeerHo commented 5 months ago

所以建议demo可以修改一下,模型的初始化等等都放到线程中。

hzgdeerHo commented 5 months ago

对于项目的几个建议:1、丰富基本的常见汉语成语词汇,例如“朝三暮四”,“得陇望蜀”,“南辕北辙”,“杯弓蛇影”等