python使用VOSK实现离线语音识别(中文普通话)

目标:一个代码简单,离线,可直接使用,常用语句准确率还不错,免费的,普通话语音转文本的工具

几番对比下来,VSOK基本满足我的需求,记录一下。

环境

windows 10 / python3.8.10


s1 安装 vosk

> pip install vosk

s2 下载模型

两个模型,一个很小,文件名中带有small字样,另一个就很大了,就我自己测试起来,small也够用

官网下载地址:

https://alphacephei.com/vosk/models/vosk-model-small-cn-0.22.zip         41.87 M
https://alphacephei.com/vosk/models/vosk-model-cn-0.15.zip                1.67 G

s3 下载 示例代码

代码位置:

https://github.com/alphacep/vosk-api

其实只用到其中的python部分

s4 测试

s4.1 把 s2下载的 model 解压,记住路径
s4.2 修改示例代码 vosk-api/python/example/test_simple.py
import wave
import sys
import json

from vosk import Model, KaldiRecognizer, SetLogLevel

# You can set log level to -1 to disable debug messages
SetLogLevel(-1)

wf = wave.open(sys.argv[1], "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
    print("Audio file must be WAV format mono PCM.")

    sys.exit(1)

# model = Model(lang="en-us")
# You can also init model by name or with a folder path
# model = Model(model_name="vosk-model-en-us-0.21")
# 设置模型所在路径,刚刚4.1中解压出来的路径   《《《《
# model = Model("model") 
model = Model("model-small")

rec = KaldiRecognizer(model, wf.getframerate())
rec.SetWords(True)
# rec.SetPartialWords(True)   # 注释这行   《《《《

str_ret = ""

while True:
    data = wf.readframes(4000)
    if len(data) == 0:
        break
    if rec.AcceptWaveform(data):
        result = rec.Result()
        # print(result)

        result = json.loads(result)
        if 'text' in result:
            str_ret += result['text'] + ' '
    # else:
    #     print(rec.PartialResult())

# print(rec.FinalResult())
result = json.loads(rec.FinalResult())
if 'text' in result:
    str_ret += result['text']

print(str_ret)
s4.3 跑一下代码
> python .\test_simple.py cn2.wav
床前明月光

测试用到的 cn2.wav 是使用系统的录音机录的,再用格式工厂转为wav格式,这里需要注意的是wav必须是单声道的,否则没法识别的。
在这里插入图片描述

结论

准确率还是不错的,就是耗时比较大,就上面的一行诗得3秒左右,不知道是不是跟电脑配置也有关系

猜你喜欢

转载自blog.csdn.net/svyee/article/details/127232464