目标:一个代码简单,离线,可直接使用,常用语句准确率还不错,免费的,普通话语音转文本的工具
几番对比下来,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必须是单声道的,否则没法识别的。
文章来源:https://www.toymoban.com/news/detail-516468.html
结论
准确率还是不错的,就是耗时比较大,就上面的一行诗得3秒左右,不知道是不是跟电脑配置也有关系文章来源地址https://www.toymoban.com/news/detail-516468.html
到了这里,关于python使用VOSK实现离线语音识别(中文普通话)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!