基于OpenAI Whisper,支持本地离线转写、带时间戳、批量处理,附带srt字幕导出。
前置安装
bash
pip install openai-whisper
务必安装ffmpeg:Windows配置环境变量;
apt install ffmpeg(Linux);brew install ffmpeg(Mac)
示例1:单文件音频转写(输出文本+时间戳)
python
import whisper
def audio_to_text(audio_path: str, model_name="small", lang="zh"):
# 加载模型,首次运行自动下载
model = whisper.load_model(model_name)
result = model.transcribe(audio_path, language=lang)
full_text = result["text"]
segments = result["segments"]
return full_text, segments
if __name__ == "__main__":
text, seg_list = audio_to_text("meeting.mp3", model_name="small", lang="zh")
print("====完整转写文本====")
print(text)
print("\n====分段时间戳====")
for seg in seg_list:
print(f"[{seg['start']:.2f}s ~ {seg['end']:.2f}s] {seg['text']}")
示例2:导出SRT字幕文件(可直接导入剪映/播放器)
python
import whisper
def write_srt(segments, srt_path):
with open(srt_path, "w", encoding="utf-8") as f:
for i, seg in enumerate(segments, start=1):
start = seg["start"]
end = seg["end"]
text = seg["text"].strip()
# 时间格式转换 s -> 00:00:01,000
def format_time(seconds):
h = int(seconds // 3600)
m = int((seconds % 3600) // 60)
s = seconds % 60
return f"{h:02d}:{m:02d}:{s:06.3f}".replace(".", ",")
f.write(f"{i}\n")
f.write(f"{format_time(start)} --> {format_time(end)}\n")
f.write(f"{text}\n\n")
if __name__ == "__main__":
model = whisper.load_model("small")
res = model.transcribe("meeting.mp3", language="zh")
write_srt(res["segments"], "output.srt")
print("字幕文件 output.srt 生成完成")
示例3:批量处理文件夹内所有音频
python
import os
import whisper
def batch_audio_transcribe(audio_dir, out_dir, model_name="small"):
os.makedirs(out_dir, exist_ok=True)
model = whisper.load_model(model_name)
support_suffix = (".mp3", ".wav", ".m4a", ".flac")
for filename in os.listdir(audio_dir):
if filename.lower().endswith(support_suffix):
audio_full_path = os.path.join(audio_dir, filename)
print(f"正在处理:{filename}")
res = model.transcribe(audio_full_path, language="zh")
base_name = os.path.splitext(filename)[0]
txt_path = os.path.join(out_dir, f"{base_name}.txt")
with open(txt_path, "w", encoding="utf-8") as f:
f.write(res["text"])
print("✅批量转写全部完成")
if __name__ == "__main__":
batch_audio_transcribe("./audio", "./asr_result", model_name="base")
示例4:云端API方式(whisper-1,不需要本地模型)
python
from openai import OpenAI
def audio_transcribe_api(audio_file_path, api_key):
client = OpenAI(api_key=api_key)
with open(audio_file_path, "rb") as audio_file:
resp = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
language="zh"
)
return resp.text
if __name__ == "__main__":
content = audio_transcribe_api("meeting.mp3", api_key="sk-xxx")
print(content)
常用踩坑提示
- 内存小的机器优先使用
base,medium/large容易OOM; - 嘈杂音频识别效果差,建议先用pydub做降噪;
- 长音频可以切分后识别,降低内存压力。