Faster-Whisper 本地实时语音识别部署实战
要实现类似微信或豆包的语音输入功能,通常有两种主流方案:云端 API(轻量、准确度高)和本地模型(免费、隐私保护、无需联网)。对于需要集成语音识别且对数据隐私有要求的系统,本地部署是更好的选择。这里记录一下使用 Faster-Whisper 实现实时语音转文本的完整流程。
一、环境安装
首先需要在虚拟环境中安装核心依赖。推荐使用 Python 3.8+ 环境。
pip install faster-whisper pyaudio
注意:原教程中提到的
pyaudiowpatch并非标准库,建议直接使用标准的pyaudio包,兼容性更好。
如果电脑有独立显卡,建议提前配置好 CUDA 和 cuDNN 环境以加速推理。具体安装步骤可参考 NVIDIA 官方文档或社区通用教程。
二、模型下载与配置
1. 模型选择
Faster-Whisper 支持多种大小的模型,根据硬件性能选择即可:
- Tiny / Base: 速度最快,适合低配设备。
- Small / Medium: 平衡速度与精度。
- Large-v2 / Large-v3: 效果最好,但需要较强算力。
- Distil-Large-v3: 蒸馏版,速度快且效果接近原版。
可以通过 Hugging Face 手动下载模型文件(如 config.json, model.bin, tokenizer.json 等),放入指定文件夹离线使用。当然,首次运行脚本时也可以让代码自动从 Hugging Face 下载。
2. 实时录音转文本脚本
下面是一个完整的 Python 脚本示例,实现了持续录音、切片处理及实时转录。代码中使用了多线程来避免录音阻塞,并集成了 VAD(语音活动检测)过滤静音片段。
# -*- coding: utf-8 -*-
import os
import sys
import time
import wave
import tempfile
import threading
import torch
import pyaudio
from faster_whisper import WhisperModel
# 录音切片时长(秒)
AUDIO_BUFFER = 5
def record_audio(p, device):
"""创建临时文件进行录音"""
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
filename = f.name
wave_file = wave.open(filename, )
wave_file.setnchannels((device[]))
wave_file.setsampwidth(p.get_sample_size(pyaudio.paInt16))
wave_file.setframerate((device[]))
():
wave_file.writeframes(in_data)
(in_data, pyaudio.paContinue)
:
stream = p.(
=pyaudio.paInt16,
channels=(device[]),
rate=(device[]),
frames_per_buffer=,
=,
input_device_index=device[],
stream_callback=callback,
)
stream.start_stream()
time.sleep(AUDIO_BUFFER)
Exception e:
()
:
():
stream.stop_stream()
stream.close()
wave_file.close()
filename
():
:
segments, info = model.transcribe(
filename,
beam_size=,
language=,
vad_filter=,
vad_parameters=(min_silence_duration_ms=)
)
segment segments:
( % (segment.start, segment.end, segment.text))
Exception e:
()
:
os.path.exists(filename):
os.remove(filename)
():
()
torch.cuda.is_available():
device =
compute_type =
()
:
device =
compute_type =
()
model_path =
:
model = WhisperModel(model_path, device=device, compute_type=compute_type, local_files_only=)
()
Exception e:
()
pyaudio.PyAudio() p:
:
default_mic = p.get_default_input_device_info()
()
()
( * )
()
:
filename = record_audio(p, default_mic)
thread = threading.Thread(target=whisper_audio, args=(filename, model))
thread.start()
OSError:
()
KeyboardInterrupt:
()
Exception e:
()
__name__ == :
main()


