项目中需要使用到语音识别,之前是使用的百度在线方式,网上的代码也较多.今天发现百度收费了,穷人就得自己想办法.
发现whisper,号称可以支持99种语言.
本机安装,项目中可以自己建一个语音识别服务器来使用.
0 需要事先安装ffmpeg. 它是靠使用ffmpeg来获取到音频.所以它也支持识别视频中的音频,以及众多的音频格式
1 https://pytorch.org/ 选择安装pytorch的模式,例如我使用了Win下的CPU模式:pip3 install torch torchvision torchaudio
2 安装开源whisper: pip install git+https://github.com/openai/whisper.git
3 更新whisper: pip install –upgrade –no-deps –force-reinstall git+https://github.com/openai/whisper.git
可以使用了,测试一下: whisper audio.mp3
它会使用几类语言模型: tiny base small medium large, 对应不同的占用率和识别率.实际项目中,我仅识别数字,用个tiny速度又快又准,消耗很小.
也可以直接指定语言,避免自动检测耗时: whisper audio.wav –language zh –model tiny
有几点要注意:
1 python的版本匹配度,我当前使用的需要小于3.11
2 由于众所周知的原因,安装whisper步骤反复多次,我甚至晚上或凌晨安装.
用Python调用
import whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
print(result["text"])
import whisper
class WhisperTranscriber(object):
def __init__(self, model_name):
self.model = whisper.load_model(model_name)
def whisper_transcribe(self, audio_path):
audio = self.model.transcribe(audio_path, fp16=False, language='Chinese')
return audio['text']
if __name__ == '__main__':
transcriber = WhisperTranscriber("base")
text = transcriber.whisper_transcribe("audio.wav")
print(text)
来个进度条
import whisper
model = whisper.load_model("base")
translate_options = dict(task="translate", **dict(language="Japanese", beam_size=5, best_of=5))
result = model.transcribe("sample1.wav",**translate_options, fp16=False, verbose=False)
print(result["text"])
另一个进度条版本
import os
import sys
import tqdm
import urllib.request
class _CustomProgressBar(tqdm.tqdm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._current = self.n # Set the initial value
def update(self, n):
super().update(n)
self._current += n
# Handle progress here
print("Progress: " + str(self._current) + "/" + str(self.total))
# Inject into tqdm.tqdm of Whisper, so we can see progress
import whisper.transcribe
transcribe_module = sys.modules['whisper.transcribe']
transcribe_module.tqdm.tqdm = _CustomProgressBar
import whisper
model = whisper.load_model("medium")
if not os.path.exists("sample1.wav"):
urllib.request.urlretrieve("https://github.com/itsupera/audiobook_alignment/raw/main/samples/sample1.wav", "sample1.wav")
result = model.transcribe("sample1.wav", language="Japanese", fp16=False, verbose=None)
print(result['text'])
https://v.scwy.net 可以上传音频(小于50MB,为了照顾幼小的服务器)转换成文字.
进行了访问频率限制.
上传后不会直接返回文字,显示一个Token字符串,通过Token字符串获取处理后的文字内容.文字内容只可获取到一次.
https://v.scwy.net/?code=…
2023.11.22
whisper命令运行时,会自动下载相应的模型。例如:whisper ~/1.mp3 –language zh –model medium
希望有只针对中文的模型,解决运行对主机的需求和速度的平衡。