前言
要实现类似豆包、微信的语音输入功能,通常有两种主流方案:云端 API(轻量、准确度高)和本地模型(免费、隐私好、无需联网)。如果开发场景需要添加语音识别且对数据隐私有要求,本地部署 Faster-Whisper 是个不错的选择。
Faster-Whisper 是 Whisper 的高效实现版本,支持多种量化级别和硬件加速。下面记录一下如何在本地环境部署并实现实时语音转文本。
一、安装环境
首先确保你的虚拟环境中安装了必要的依赖。核心库是 faster-whisper,录音部分使用 pyaudio。
pip install faster-whisper pyaudio
如果有 NVIDIA 显卡,建议提前配置好 CUDA 和 cuDNN 环境,否则推理速度会受限。具体安装步骤可参考官方文档或相关技术社区教程。
二、使用步骤
1. 下载模型
如果你希望离线使用,或者想把模型文件放在指定目录,可以手动从 Hugging Face 下载。根据需求选择合适的模型大小:
- Tiny (最小/最快): Systran/faster-whisper-tiny
- Base: Systran/faster-whisper-base
- Small: Systran/faster-whisper-small
- Medium: Systran/faster-whisper-medium
- Large-v2: Systran/faster-whisper-large-v2
- Large-v3 (效果最好): Systran/faster-whisper-large-v3
- Distil-Large-v3 (蒸馏版/速度快): Systran/faster-distil-whisper-large-v3
在 Hugging Face 的 "Files and versions" 页面中,下载以下几个关键文件并存入同一个文件夹:
config.jsonmodel.bintokenizer.jsonvocabulary.jsonpreprocessor_config.json
2. 实时录音转文本脚本
下面是完整的 Python 脚本示例。代码中使用了多线程来分离录音和转录过程,避免阻塞主循环。
# -*- 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():
tempfile.NamedTemporaryFile(suffix=, delete=) f:
filename = f.name
wave_file = wave.(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()


