在前文《将Snowboy语音唤醒的“叮”一声改成自定义语言》中,我已经实现唤醒snowboy后,树莓派会说一句自定义文本。今天,会在此基础上增加ASR的应用(基于sherpa-ncnn)。
首先,编写一个asr.py的程序,程序可以直接参考前文《树莓派智能语音助手之ASR2 – sherpa-ncnn》中的官网示例,我只是做了简单的修改:
import sounddevice as sd
import sherpa_ncnndef init():recognizer = sherpa_ncnn.Recognizer(tokens="model/sherpa-ncnn/tokens.txt",encoder_param="model/sherpa-ncnn/encoder_jit_trace-pnnx.ncnn.param",encoder_bin="model/sherpa-ncnn/encoder_jit_trace-pnnx.ncnn.bin",decoder_param="model/sherpa-ncnn/decoder_jit_trace-pnnx.ncnn.param",decoder_bin="model/sherpa-ncnn/decoder_jit_trace-pnnx.ncnn.bin",joiner_param="model/sherpa-ncnn/joiner_jit_trace-pnnx.ncnn.param",joiner_bin="model/sherpa-ncnn/joiner_jit_trace-pnnx.ncnn.bin",num_threads=4,)return recognizerdef asr():recognizer = init()sample_rate = recognizer.sample_ratesamples_per_read = int(1.5 * sample_rate) last_result = ""print("说些什么……")with sd.InputStream(channels=1, dtype="float32", samplerate=sample_rate) as s:while True:samples, _ = s.read(samples_per_read) # a blocking readsamples = samples.reshape(-1)recognizer.accept_waveform(sample_rate, samples)result = recognizer.textif last_result != result:last_result = resultreturn result
然后,在我的项目文件夹下的demo.py去调用上面的asr函数。还记得在《将Snowboy语音唤醒的“叮”一声改成自定义语言》一文中,我加了一个callback函数吗?这次就是继续在这个函数中添加两行代码:
a=asr.asr()
print(“识别结果:”+a)
当然,在demo.py文件头部别忘了import asr。
运行的结果是,我每唤醒一次snowboy,就会显示“说些什么……”,然后我就对着麦克风说个短句,之后等个10来秒的样子,就会显示“识别结果”。目前的代码是每一次识别完成后,就要再唤醒snowboy一次,如循环直到按了CTRL+C退出。