#语音识别# 技术目前有很多开源库可以使用。具体能力和性能如下(测试环境为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("未成功获取转录结果。")
参考资料
- https://alphacephei.com/vosk/models
- https://modelscope.cn/models?name=ASR