Python ASR音频转文本 完整代码示例

基于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)

常用踩坑提示

  1. 内存小的机器优先使用 basemedium/large容易OOM;
  2. 嘈杂音频识别效果差,建议先用pydub做降噪;
  3. 长音频可以切分后识别,降低内存压力。
相关推荐
JarmanYuo1 小时前
YOLO 涨点研究(十二):具身 CV 进阶篇——Sim2Real 域随机化与真机部署
人工智能·pytorch·python·yolo·计算机视觉
小蒜学长1 小时前
基于Python的微博热搜话题可视化分析系统的设计与实现(代码+数据库+LW)
后端·python·django·数据可视化·情感分析·微博热搜
梦帮科技1 小时前
从提示词到可复现音乐工作流:RNOISE 2.0 的 Prompt Engineering 架构
人工智能·python·mysql·ci/cd·架构·node.js·numpy
飞Link1 小时前
【Numpy】 第三部分:矩阵运算与线性代数(计算篇)
python·numpy
电商API_180079052471 小时前
电商平台数据分析实战_帖子
开发语言·爬虫·python·数据采集·京东
带多刺的玫瑰2 小时前
Leecode#35刷题之搜索插入位置
java·python·算法
QQ14220784492 小时前
IIS + wfastcgi 部署 Flask 应用实战:从连续 500 到稳定 200 的完整踩坑实录
python
WiKiLeaks_successor2 小时前
Scipy库里的众数函数不严谨,我把它重构了。
python·scipy
傻啦嘿哟2 小时前
房产数据对比爬虫:同时爬取链家+贝壳+安居客,做房价横向对比
python