几个STT开源库对比



#语音识别# 技术目前有很多开源库可以使用。具体能力和性能如下(测试环境为Python3.11,windows 11 .8核16G无显卡笔记本电脑)



使用edge-tts将如下文本生成一个语音文件;然后作为输入,可准确识别的仅有whisper、funasr,vosk可单独识别英文或者中文,且不支持标点符号。


Are you sleeping?This is an illegal sentence. 你在睡觉吗?这个问题有问题。


中文

英文

混合识别

标点

私有化

模型耗时

识别耗时

whisper

Y

Y

Y

Y

Y

1

1

vosk

Y

Y

N

O

Y

19

2

funasr

Y

Y

Y

Y

Y

34

1.2

如上测试结果,whisper使用的base模型,vosk使用的vosk-model-cn-0.22,funasr使用的AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc")。


STT相关代码

https://gitee.com/wapuboy/jygt-tts-agent.git

# funasr
import time

audio_file = "D:\\work\\gitee\\jygt-tts-agent\\tts\\edge\\web_output\\2025-06-11\\b4f263334ee67214010970e31398f798_222543.mp3"

# 记录模型加载开始时间
model_load_start = time.time()
from funasr import AutoModel
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc")
# 记录模型加载结束时间
model_load_end = time.time()
model_load_time = model_load_end - model_load_start

# 记录识别开始时间
recognition_start = time.time()
result = model.generate(
    input=audio_file,
    batch_size_s=300,  # 动态批处理窗口(秒)
    #hotword=["达摩院", "机器学习", 20]  # 热词加权
)
# 记录识别结束时间
recognition_end = time.time()
recognition_time = recognition_end - recognition_start

print("\r\n\r\n===============\r\n")
print(result[0]["text"])  # 输出带标点文本

# 输出耗时信息
print(f"模型加载时间: {model_load_time} 秒")
print(f"录音识别文字耗费时间: {recognition_time} 秒")

#print(result[0]["timestamp"])  # 时间戳信息


# vosk
from vosk import Model, KaldiRecognizer
from pydub import AudioSegment
import io
import json
import os
import time

# 记录模型加载开始时间
model_load_start = time.time()

MODEL_PATH = "D:\\SETUP\\vosk\\vosk-model-cn-0.22\\vosk-model-cn-0.22"

# 初始化
model = Model(MODEL_PATH)
recognizer = KaldiRecognizer(model, 16000)
recognizer.SetWords(True)
recognizer.SetPartialWords(True)

# 记录模型加载结束时间
model_load_end = time.time()
model_load_time = model_load_end - model_load_start

# 替换为您实际的音频文件路径
audio_file_path = "D:\\work\\gitee\\jygt-tts-agent\\tts\\edge\\web_output\\2025-06-05\\1e376ad43685496bb1b5cffbb1ed24b9_192721.mp3"

audio_file = "D:\\work\\gitee\\jygt-tts-agent\\tts\\edge\\web_output\\2025-06-11\\b4f263334ee67214010970e31398f798_222543.mp3"
audio_file_path=audio_file
# 记录识别开始时间
recognition_start = time.time()

# 将 MP3 转换为 WAV
audio = AudioSegment.from_mp3(audio_file_path)
audio = audio.set_frame_rate(16000).set_channels(1)
wav_io = io.BytesIO()
audio.export(wav_io, format="wav")
wav_io.seek(0)

# 进行语音识别
while True:
    data = wav_io.read(4000)
    if len(data) == 0:
        break
    if recognizer.AcceptWaveform(data):
        result = json.loads(recognizer.Result())
        print(result.get("text", ""))

# 获取最终结果
final_result = json.loads(recognizer.FinalResult())
print(final_result.get("text", ""))

# 记录识别结束时间
recognition_end = time.time()
recognition_time = recognition_end - recognition_start

print(f"模型加载耗时: {model_load_time} 秒")
print(f"录音识别文本耗时: {recognition_time} 秒")
#whisper
from numpy import float16
from torch import initial_seed
import whisper
import time

def transcribe_audio(audio_path, model_size='base'):
    """
    使用 Whisper 模型将音频文件转录为文本。

    :param audio_path: 音频文件的路径
    :param model_size: Whisper 模型的大小,可选值有 'tiny', 'base', 'small', 'medium', 'large'
    :return: 转录后的文本
    """
    try:
        # 记录模型加载开始时间
        model_load_start = time.time()
        # 加载模型
        model = whisper.load_model(model_size)
        # 记录模型加载结束时间
        model_load_end = time.time()
        model_load_time = model_load_end - model_load_start

        # 记录转录开始时间
        transcribe_start = time.time()
        # 进行转录
        result = model.transcribe(audio_path,language='zh',fp16=False,
            condition_on_previous_text=False,without_timestamps=False,
            initial_prompt="以下是普通话的句子,这是一段学术讲座。This is an academic lecture.")
        # 记录转录结束时间
        transcribe_end = time.time()
        transcribe_time = transcribe_end - transcribe_start

        print(f"模型加载耗时: {model_load_time} 秒")
        print(f"语音识别耗时: {transcribe_time} 秒")

        # 返回转录文本
        return result["text"]
    except Exception as e:
        print(f"转录过程中出现错误: {e}")
        return ""

if __name__ == "__main__":
    # 替换为您实际的音频文件路径
    audio_file_path = "D:\\work\\gitee\\jygt-tts-agent\\tts\\edge\\web_output\\2025-06-11\\b4f263334ee67214010970e31398f798_222543.mp3"
    # 可以根据需要修改模型大小
    model_size = 'base'
    
    transcription = transcribe_audio(audio_file_path, model_size)
    if transcription:
        print(f"转录结果: {transcription}")
    else:
        print("未成功获取转录结果。")

参考资料

  1. https://alphacephei.com/vosk/models



  1. https://modelscope.cn/models?name=ASR


原文链接:,转发请注明来源!