Python 语音转文字中文—vosk

Vosk 简介与音频转文本实践

Vosk 是一个基于 Kaldi 的开源语音识别工具包,支持离线语音识别。其特点是轻量、高效,并支持多种语言,适用于实时语音转文本场景。


一、Vosk 的原理

1. 基础原理

Vosk 基于 Kaldi 的语音识别模型,核心流程包括:

  1. 声学模型(Acoustic Model):将音频信号转换为声学特征。
  2. 语言模型(Language Model):通过概率模型匹配可能的词序列。
  3. 解码器(Decoder):结合声学模型和语言模型生成最终的转录文本。
2. 优势
  • 离线识别:不依赖云端服务,保障隐私和低延迟。
  • 多语言支持:内置多种语言模型,开箱即用。
  • 跨平台:支持 Python、JavaScript、C++ 等多种语言及操作系统。

  • 二、实践:使用 Vosk 进行音频转文本

    以下示例以 Python 为例,展示如何使用 Vosk 实现音频转文本。

    1. 环境准备

    安装 Vosk

    pip install vosk
    

    安装音频处理库

    pip install soundfile
    
    2. 下载语言模型
  • 从 Vosk 模型库 下载合适的语言模型(如英文 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. 音频格式要求
  • 单声道:多声道音频需转换为单声道。
  • 采样率:推荐 16000 Hz,需与模型一致。
  • 采样位宽:16 位(PCM 格式)。
  • 可使用工具(如 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

  • 四、应用场景

    1. 实时语音识别
    2. 使用麦克风捕获音频并实时转文本。
    3. 批量音频转录
    4. 将大量音频文件转录为文本,用于内容分析或存档。
    5. 智能语音助手
    6. 集成 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

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 语音转文字中文—vosk

    发表回复