Whisper 开源免费离线语音识别

项目中需要使用到语音识别,之前是使用的百度在线方式,网上的代码也较多.今天发现百度收费了,穷人就得自己想办法.
发现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
希望有只针对中文的模型,解决运行对主机的需求和速度的平衡。