1. 本地AI语音转写方案概述
最近在整理会议录音时,发现市面上的在线语音转写服务要么收费昂贵,要么存在隐私风险。经过两周的实测,我总结出一套完全本地的AI语音转写工作流,从基础的音频转文字到最终可交付的文稿,全程无需联网,准确率可达90%以上。这套方案特别适合处理敏感内容或需要反复修改的采访录音、会议记录等场景。
核心工具链采用Whisper.cpp作为转写引擎,配合Python脚本进行后处理。整个流程在MacBook Pro M1上实测,1小时音频处理时间约15分钟(取决于模型大小)。相比在线服务,本地方案最大的优势是数据不出本地,且可以针对特定场景做定制优化。
2. 环境搭建与工具选型
2.1 硬件准备建议
虽然理论上任何现代电脑都能运行,但建议:
- 至少16GB内存(处理长音频时更稳定)
- 支持AVX指令集的CPU(Intel四代以上或AMD Ryzen)
- 配备Apple Silicon的Mac效果最佳
我的测试环境:
- MacBook Pro 14" M1 Pro/32GB
- Ubuntu 22.04 on Intel i7-11800H/64GB
- 两种环境下均能流畅运行medium模型
2.2 软件工具安装
基础组件安装(以MacOS为例):
bash复制# 安装Homebrew(如未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装依赖项
brew install ffmpeg cmake
# 下载Whisper.cpp
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp && make
模型下载建议:
bash复制# 基础模型选择(按需下载)
./models/download-ggml-model.sh base.en
./models/download-ggml-model.sh medium.en
注意:base模型约150MB,速度最快但准确率较低;medium模型约1.5GB,是速度与精度的平衡点
3. 基础转写实操
3.1 单文件转写命令
基本转写命令格式:
bash复制./main -m models/ggml-medium.en.bin -f input.mp3 -l en -otxt
关键参数解析:
-m:指定模型路径-f:输入音频文件-l:语言代码(en/zh等)-otxt:输出纯文本
实测案例:
bash复制# 处理30分钟会议录音
time ./main -m models/ggml-medium.en.bin -f meeting.mp3 -l en -otxt
# 输出结果
real 4m32.114s
user 15m21.457s
sys 0m12.883s
转写结果自动生成meeting.txt,包含时间戳和文本内容。
3.2 批量处理脚本
创建process.sh脚本:
bash复制#!/bin/bash
for file in ./audio/*.mp3; do
base=$(basename "$file" .mp3)
./main -m models/ggml-medium.en.bin -f "$file" -l en -otxt -of "./output/${base}"
done
4. 从转写到可交付文稿
4.1 自动标点优化
原始转写缺乏标点,使用Python进行后处理:
python复制import re
def add_punctuation(text):
# 问句处理
text = re.sub(r'(\s)(how|what|when|where|why|who|does|do|did|is|are|was|were|can|could|will|would)(\s)', r'\1\2\3?', text, flags=re.IGNORECASE)
# 句号处理
text = re.sub(r'(\s[a-z]{10,}[.!?])(\s[A-Z])', r'\1\2', text)
return text
4.2 说话人分离方案
结合PyAnnoteAudio实现:
python复制from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization")
def diarize_audio(audio_file):
diarization = pipeline(audio_file)
for turn, _, speaker in diarization.itertracks(yield_label=True):
print(f"{speaker}: {turn.start:.1f}s - {turn.end:.1f}s")
4.3 术语校正技巧
创建术语表JSON文件:
json复制{
"神经网络": ["neural net", "neural network"],
"GPU": ["g p u", "graphics processor"]
}
校正脚本示例:
python复制import json
with open('terms.json') as f:
terms = json.load(f)
def correct_terms(text):
for correct_term, variants in terms.items():
for variant in variants:
text = text.replace(variant, correct_term)
return text
5. 高级优化方案
5.1 领域自适应训练
使用LoRA进行微调:
bash复制python finetune.py \
--base_model=ggml-medium.en \
--data_dir=./legal_audio \
--output_dir=./legal_model \
--lora_r=8 \
--num_epochs=3
5.2 实时转写实现
基于SoundDevice的实时采集:
python复制import sounddevice as sd
import numpy as np
def callback(indata, frames, time, status):
audio = np.frombuffer(indata, dtype='float32')
# 发送到Whisper处理
5.3 多语言混合处理
强制语言切换参数:
bash复制./main -m models/ggml-medium.bin -f bilingual.mp3 -l auto --language-threshold 0.5
6. 常见问题排查
6.1 音频预处理要点
问题:转写结果出现大量无意义字符
解决方案:
bash复制# 先统一音频格式
ffmpeg -i input.m4a -ar 16000 -ac 1 -c:a pcm_s16le output.wav
6.2 内存不足处理
修改量化版本:
bash复制# 使用量化模型
./quantize models/ggml-medium.en.bin models/ggml-medium.en.q5_0.bin q5_0
6.3 时间戳对齐技巧
后处理脚本示例:
python复制def align_timestamps(text, audio_length):
segments = text.split('\n\n')
avg_seg_len = audio_length / len(segments)
for i, seg in enumerate(segments):
start = i * avg_seg_len
end = (i+1) * avg_seg_len
print(f"[{start:.2f}-{end:.2f}] {seg}")
7. 生产环境部署
7.1 Docker化方案
Dockerfile示例:
dockerfile复制FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
ffmpeg python3-pip git cmake
RUN git clone https://github.com/ggerganov/whisper.cpp
WORKDIR /whisper.cpp
RUN make
7.2 API服务封装
FastAPI示例:
python复制from fastapi import FastAPI, UploadFile
app = FastAPI()
@app.post("/transcribe")
async def transcribe(file: UploadFile):
with open("temp_audio.mp3", "wb") as f:
f.write(await file.read())
# 调用whisper.cpp处理
return {"text": result}
7.3 自动化工作流
GitHub Actions配置:
yaml复制name: Audio Processing
on: [push]
jobs:
process:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: |
cd whisper.cpp
make
./main -m models/ggml-medium.en.bin -f test.mp3 -otxt
经过三个月的实际使用,这套本地转写系统已经处理了超过200小时的会议录音。最大的体会是:前期花时间建立好术语库和标点规则,后期可以节省80%的校对时间。对于技术类内容,medium模型+术语校正的组合,准确率甚至超过某些商业产品。