Python 语音转文字中文—vosk
Vosk 简介与音频转文本实践
Vosk 是一个基于 Kaldi 的开源语音识别工具包,支持离线语音识别。其特点是轻量、高效,并支持多种语言,适用于实时语音转文本场景。
一、Vosk 的原理
1. 基础原理
Vosk 基于 Kaldi 的语音识别模型,核心流程包括:
- 声学模型(Acoustic Model):将音频信号转换为声学特征。
- 语言模型(Language Model):通过概率模型匹配可能的词序列。
- 解码器(Decoder):结合声学模型和语言模型生成最终的转录文本。
2. 优势
二、实践:使用 Vosk 进行音频转文本
以下示例以 Python 为例,展示如何使用 Vosk 实现音频转文本。
1. 环境准备
安装 Vosk
pip install vosk
安装音频处理库
pip install soundfile
2. 下载语言模型
vosk-model-small-en-us-0.15
或中文 vosk-model-small-cn-0.22
)。3. Python 实现代码
以下代码实现了音频文件的转文本:
import wave
import json
from vosk import Model, KaldiRecognizer
# 加载 Vosk 模型
MODEL_PATH = "vosk-model-small-en-us-0.15" # 修改为您的模型路径
model = Model(MODEL_PATH)
# 处理音频文件
def transcribe_audio(audio_path):
# 打开音频文件
wf = wave.open(audio_path, "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getframerate() not in [8000, 16000]:
raise ValueError("音频格式不支持,仅支持单声道、16位采样、8k 或 16k 采样率的音频")
# 初始化识别器
recognizer = KaldiRecognizer(model, wf.getframerate())
# 转录文本
result_text = ""
while True:
data = wf.readframes(4000)
if len(data) == 0:
break
if recognizer.AcceptWaveform(data):
result = json.loads(recognizer.Result())
result_text += result.get("text", "") + " "
# 获取最后的部分
final_result = json.loads(recognizer.FinalResult())
result_text += final_result.get("text", "")
wf.close()
return result_text
# 示例:转换音频文件
if __name__ == "__main__":
audio_file = "test.wav" # 替换为您的音频文件路径
try:
transcript = transcribe_audio(audio_file)
print("转录结果:")
print(transcript)
except Exception as e:
print(f"转换失败:{e}")
三、注意事项
1. 音频格式要求
可使用工具(如 ffmpeg
)进行格式转换:
ffmpeg -i input.mp3 -ac 1 -ar 16000 -sample_fmt s16 output.wav
2. 模型选择
根据语言选择合适的 Vosk 模型。例如:
vosk-model-small-en-us
vosk-model-small-cn
3. 性能优化
small
)提高识别速度。vosk-model-small
。四、应用场景
- 实时语音识别
- 使用麦克风捕获音频并实时转文本。
- 批量音频转录
- 将大量音频文件转录为文本,用于内容分析或存档。
- 智能语音助手
- 集成 Vosk 实现离线语音识别。
五、扩展:实时语音转文本
以下代码展示如何使用麦克风实时转文本:
import pyaudio
from vosk import Model, KaldiRecognizer
# 加载模型
MODEL_PATH = "vosk-model-small-en-us-0.15" # 修改为您的模型路径
model = Model(MODEL_PATH)
# 初始化音频流
recognizer = KaldiRecognizer(model, 16000)
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=4000)
stream.start_stream()
print("开始实时语音识别,按 Ctrl+C 退出:")
try:
while True:
data = stream.read(4000, exception_on_overflow=False)
if recognizer.AcceptWaveform(data):
result = recognizer.Result()
print(json.loads(result).get("text", ""))
except KeyboardInterrupt:
print("\n结束语音识别")
finally:
stream.stop_stream()
stream.close()
p.terminate()
六、总结
Vosk 提供了一种高效、轻量的离线语音转文本解决方案。通过本文示例,您可以快速上手音频文件的转录及实时语音识别,并在隐私敏感或网络受限场景下广泛应用。
作者:drebander