在前文《将Snowboy语音唤醒的“叮”一声改成自定义语言》中,我已经实现唤醒snowboy后,树莓派会说一句自定义文本。今天,会在此基础上增加ASR的应用(基于sherpa-ncnn)。
首先,编写一个asr.py的程序,程序可以直接参考前文《树莓派智能语音助手之ASR2 – sherpa-ncnn》中的官网示例,我只是做了简单的修改:
import sounddevice as sd
import sherpa_ncnn
def 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 recognizer
def asr():
recognizer = init()
sample_rate = recognizer.sample_rate
samples_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 read
samples = samples.reshape(-1)
recognizer.accept_waveform(sample_rate, samples)
result = recognizer.text
if last_result != result:
last_result = result
return result
然后,在我的项目文件夹下的demo.py去调用上面的asr函数。还记得在《将Snowboy语音唤醒的“叮”一声改成自定义语言》一文中,我加了一个callback函数吗?这次就是继续在这个函数中添加两行代码:
a=asr.asr()
print(“识别结果:”+a)
当然,在demo.py文件头部别忘了import asr。
运行的结果是,我每唤醒一次snowboy,就会显示“说些什么……”,然后我就对着麦克风说个短句,之后等个10来秒的样子,就会显示“识别结果”。目前的代码是每一次识别完成后,就要再唤醒snowboy一次,如循环直到按了CTRL+C退出。