基于whisper和ffmpeg语音转文本小程序

目录

一、环境准备

[✅ 第一步:安装并准备 Conda 环境](#✅ 第一步:安装并准备 Conda 环境)

[✅ 第二步:创建 Whisper 专用的 Conda 虚拟环境](#✅ 第二步:创建 Whisper 专用的 Conda 虚拟环境)

[✅ 第三步:安装 GPU 加速版 PyTorch(适配 RTX 4060)](#✅ 第三步:安装 GPU 加速版 PyTorch(适配 RTX 4060))

[✅ 第四步:安装 Whisper 和 FFMPEG 依赖](#✅ 第四步:安装 Whisper 和 FFMPEG 依赖)

[✅ 补充:可以切换到国内镜像(加速)](#✅ 补充:可以切换到国内镜像(加速))

二、编写代码实现语音转文本功能

[✅ 第一步:创建并运行 Whisper 脚本](#✅ 第一步:创建并运行 Whisper 脚本)

[✅ 第二步:转录完成!🎉](#✅ 第二步:转录完成!🎉)

[✅ 注意事项:](#✅ 注意事项:)

[1. import whisper](#1. import whisper)

[2. file_path = r"..."](#2. file_path = r"...")

[3. model = whisper.load_model("medium")](#3. model = whisper.load_model("medium"))

[4. result = model.transcribe(file_path, verbose=True)](#4. result = model.transcribe(file_path, verbose=True))

[5. print("📄 识别内容:") 和 print(result["text"])](#5. print("📄 识别内容:") 和 print(result["text"]))

总结底层流程:

三、TXT格式美化

四、例句对照翻译

五、常见报错

[✅ 解决方法:给 Python 显式指定 ffmpeg.exe 的路径](#✅ 解决方法:给 Python 显式指定 ffmpeg.exe 的路径)

六、更高级的功能------使用PyQt添加GUI


一、环境准备

✅ 第一步:安装并准备 Conda 环境

如果你还没装 Conda(Anaconda 或 Miniconda),请先下载安装:

推荐下载 Miniconda(轻量)

👉 Miniconda 官网下载地址

下载 Windows 64-bit 安装版并安装(默认设置即可)。

✅ 第二步:创建 Whisper 专用的 Conda 虚拟环境

打开 Anaconda PromptCMD 命令行,依次输入以下命令:

复制代码
# 创建一个新环境,名字叫 whisper_env,使用 Python 3.10
conda create -n whisper_env python=3.10 -y

# 进入这个环境
conda activate whisper_env

✅ 第三步:安装 GPU 加速版 PyTorch(适配 RTX 4060)

也可以对照自己的设备安装其他版本或CPU版本。

复制代码
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

这个命令会安装支持 CUDA 11.8 的 PyTorch,完美适配 RTX 4060,自动使用 GPU 加速。

✅ 第四步:安装 Whisper 和 FFMPEG 依赖

复制代码
pip install git+https://github.com/openai/whisper.git
pip install ffmpeg-python

✅ 补充:可以切换到国内镜像(加速)

如果你还是下载慢或失败,也可以加上清华源:

复制代码
pip install -U openai-whisper -i https://pypi.tuna.tsinghua.edu.cn/simple

安装成功后你可以验证一下:

复制代码
python -c "import whisper; print(whisper.__version__)"

确认没有报错即可。

还需要你手动安装 ffmpeg 可执行文件(一次性操作):

Windows 下安装 FFmpeg:

  1. 访问:https://www.gyan.dev/ffmpeg/builds/

  2. 下载 "Release full" 版本(Zip 文件)

  3. 解压到任意文件夹,例如:C:\ffmpeg

  4. C:\ffmpeg\bin 添加到系统环境变量 Path 中:

    • 搜索"环境变量" → 编辑系统变量 → 找到 Path → 添加 C:\ffmpeg\bin

验证成功:打开新的命令行窗口,输入:

复制代码
ffmpeg -version

二、编写代码实现语音转文本功能

✅ 第一步:创建并运行 Whisper 脚本

  1. 在当前目录创建 whisper_transcribe_gpu.py,填入以下代码:

    import whisper
    import os

    def transcribe_audio(file_path, model_size="large"):
    if not os.path.isfile(file_path):
    print("❌ 找不到文件:", file_path)
    return

    复制代码
     print(f"🎯 加载 Whisper 模型({model_size})...")
     model = whisper.load_model(model_size)
    
     print(f"🧠 正在识别音频:{file_path}")
     result = model.transcribe(file_path, fp16=True)  # 使用 GPU 加速
    
     print("\n📄 识别内容:\n")
     print(result["text"])
    
     output_file = os.path.splitext(file_path)[0] + "_transcription.txt"
     with open(output_file, "w", encoding="utf-8") as f:
         f.write(result["text"])
    
     print(f"\n✅ 转录已保存至:{output_file}")

    举例用法

    if name == "main":
    transcribe_audio("7 Test4.Section1.mp3", model_size="large")

  • 将你的 MP3 文件(比如 7 Test4.Section1.mp3)放到这个脚本同目录下。

  • 运行脚本:

    python whisper_transcribe_gpu.py

✅ 第二步:转录完成!🎉

你将会在终端看到转录内容,并且自动保存为 .txt 文本文件。

✅ 注意事项:

使用ffmpeg转换文件格式:

CMD输入:

复制代码
 ffmpeg -i "D:\xx\Programs\VS_Py_AudiosConvertText\audios\_7Test4_Section1.mp3" -ar 16000 -ac 1 -c:a pcm_s16le "D:\xxx\Programs\VS_Py_AudiosConvertText\audios\_7Test4_Section1.wav"

文件路径格式:

"xxx\xxx.mp3"

"xxx\xxx.wav"

"xxx\xxx.m4a"(录音文件)

......

复制代码
import whisper

file_path = "audios\录音.m4a"
model = whisper.load_model("medium")

result = model.transcribe(file_path, verbose=True)

print("📄 识别内容:")
print(result["text"])

output_txt_path = "results\录音.txt"
with open(output_txt_path, "w", encoding="utf-8") as f:
    f.write(result["text"])

1. import whisper

  • 这是导入 OpenAI 的 Whisper 语音识别库的 Python 模块。

  • Whisper 底层是一个基于 Transformer 架构的端到端语音识别模型,支持多种语言的语音转文字。


2. file_path = r"..."

  • 指定要识别的音频文件的路径。

  • r""是Python的原始字符串表示法,避免路径中的反斜杠被误解析。


3. model = whisper.load_model("medium")

  • 调用 Whisper 的 load_model 函数加载一个预训练的模型,这里选用的是 "medium" 版本。

  • Whisper 提供多种模型大小(tiny, base, small, medium, large),不同模型准确度和运行速度不同。

  • 这个加载过程会在后台从本地缓存或网络下载模型权重文件,初始化模型结构。

  • 加载后模型就可以接受音频输入,做后续识别。


4. result = model.transcribe(file_path, verbose=True)

  • 这里调用了模型的 transcribe 方法,传入音频文件路径,执行音频识别任务。

  • transcribe 内部做了以下步骤:

    • 音频预处理:将音频文件解码成统一采样率的波形数据(通常是16kHz单声道)。

    • 特征提取:将音频波形转换成声学特征(如梅尔频谱),这是模型输入的格式。

    • 模型推理:通过 Transformer 模型进行前向计算,解码出对应的文本序列。

    • 解码:模型输出的是概率分布,结合语言模型概率,使用贪心或beam search方法确定最终的文字。

    • 可选参数 verbose=True 会在识别过程中打印详细的日志,帮助调试和观察进度。

  • 返回结果 result 是一个字典,至少包含 "text" 字段,是识别出来的文本内容。


5. print("📄 识别内容:")print(result["text"])

  • 这两行是将识别结果文本打印到控制台。
  1. 保存识别结果到txt文件:

    output_txt_path = r"..."
    with open(output_txt_path, "w", encoding="utf-8") as f:
    f.write(result["text"])

总结底层流程:

  1. 加载预训练模型(初始化模型参数和结构)

  2. 读取并预处理音频数据

  3. 使用模型进行声学特征提取和文本解码

  4. 输出文字识别结果

  5. 将结果保存到文件。

三、TXT格式美化

复制代码
import whisper

file_path = "audios\_7Test4_Section1.wav"
model = whisper.load_model("large")

# 进行转录
result = model.transcribe(file_path, verbose=True)

# 输出路径
output_txt_path = "results\result_output.txt"

# 保存为纯文本格式(无时间戳)
with open(output_txt_path, "w", encoding="utf-8") as f:
    f.write("Detecting language using up to the first 30 seconds. Use `--language` to specify the language\n")
    f.write(f"Detected language: {result['language'].capitalize()}\n")
    f.write(result["text"].strip())  # 写入识别结果的纯文本部分

print("✅ 文本文件保存完成(无时间戳)!路径如下:")
print(output_txt_path)

四、例句对照翻译

使用 whisper 提取的英文文本,再用 Google Translatedeep-translator 这类工具翻译成中文,然后生成如下格式的中英对照文本:

🛠 安装依赖(只需一次):

复制代码
pip install deep-translator

✅ 脚本代码:

复制代码
import whisper
from deep_translator import GoogleTranslator
import os
# 添加 ffmpeg 路径到系统环境变量中(你之前写的)
os.environ["PATH"] += os.pathsep + r"D:\LiuYanhong\Apps\Ffmpeg\ffmpeg-7.1.1-full_build\ffmpeg-7.1.1-full_build\bin"

file_path = "audios\_7Test4_Section1.mp3"

model = whisper.load_model("small", device='cpu')  # 使用 CPU 进行转录,避免内存不足问题

# 转录音频
result = model.transcribe(file_path, verbose=True, fp16=False)  # 使用 CPU 进行转录,避免内存不足问题

# 提取文本,按句子拆分
text = result["text"].strip()
sentences = [s.strip() for s in text.split('.') if s.strip()]
# 补上句号
sentences = [s + '.' for s in sentences]

# 翻译
translator = GoogleTranslator(source='en', target='zh-CN')

translated_sentences = [translator.translate(s) for s in sentences]

# 确保保存目录存在
output_dir = "results"
os.makedirs(output_dir, exist_ok=True)

# 生成保存路径
base_name = os.path.splitext(os.path.basename(file_path))[0]
output_txt_path = os.path.join(output_dir, f"{base_name}_transcription.txt")

# 写入中英对照内容
with open(output_txt_path, "w", encoding="utf-8") as f:
    f.write("Detecting language using up to the first 30 seconds. Use `--language` to specify the language\n")
    f.write(f"Detected language: {result['language'].capitalize()}\n\n")

    for en, zh in zip(sentences, translated_sentences):
        f.write(en + "\n")
        f.write(zh + "\n\n")

print("✅ 中英对照文本文件保存完成!路径如下:")
print(output_txt_path)

五、常见报错

FileNotFoundError: [WinError 2] 系统找不到指定的文件。

这个错误 [WinError 2] 系统找不到指定的文件。 明确是因为 Whisper 在底层调用 ffmpeg 时找不到 ffmpeg 可执行文件

虽然你可以在命令行中用 ffmpeg 成功转换音频,但是 Python 中的 Whisper 并不会使用你系统 PATH 中的 ffmpeg ,它会调用 ffmpeg 命令,要求它能在 Python 环境里被找到。

最常见的一个报错:

✅ 解决方法:给 Python 显式指定 ffmpeg.exe 的路径

你只需要把 ffmpeg.exe 所在的文件夹加入到 Python 脚本的环境变量中。操作如下:

复制代码
import os
# 添加 ffmpeg 路径到系统环境变量中(你之前写的)
os.environ["PATH"] += os.pathsep + r"D:\LiuYanhong\Apps\Ffmpeg\ffmpeg-7.1.1-full_build\ffmpeg-7.1.1-full_build\bin"

六、更高级的功能------使用PyQt添加GUI

复制代码
import sys
import os
from PyQt5.QtWidgets import (
    QApplication, QWidget, QLabel, QPushButton,
    QVBoxLayout, QFileDialog, QTextEdit, QMessageBox,
    QComboBox, QCheckBox
)
from PyQt5.QtCore import QThread, pyqtSignal
import whisper
from deep_translator import GoogleTranslator

# 添加 ffmpeg 路径
os.environ["PATH"] += os.pathsep + r"D:\LiuYanhong\Apps\Ffmpeg\ffmpeg-7.1.1-full_build\ffmpeg-7.1.1-full_build\bin"

# Whisper 模型
model = whisper.load_model("small", device="cpu")

# 可选语言映射
LANGUAGES = {
    "英语 (English)": "en",
    "中文 (Chinese)": "zh-CN",
    "日语 (Japanese)": "ja",
    "韩语 (Korean)": "ko",
    "法语 (French)": "fr",
    "德语 (German)": "de",
    "西班牙语 (Spanish)": "es",
    "俄语 (Russian)": "ru"
}


class TranscriptionWorker(QThread):
    finished = pyqtSignal(str, str)
    error = pyqtSignal(str)

    def __init__(self, file_path, source_lang, target_lang, translate_enabled=True):
        super().__init__()
        self.file_path = file_path
        self.source_lang = source_lang
        self.target_lang = target_lang
        self.translate_enabled = translate_enabled

    def run(self):
        try:
            result = model.transcribe(
                self.file_path,
                language=self.source_lang if self.source_lang != "auto" else None,
                verbose=False,
                fp16=False
            )

            text = result["text"].strip()
            sentences = [s.strip() for s in text.split('.') if s.strip()]
            sentences = [s + '.' for s in sentences]

            output = f"Detected language: {result['language']}\n\n"

            if self.translate_enabled:
                translator = GoogleTranslator(source='auto', target=self.target_lang)
                translated_sentences = [translator.translate(s) for s in sentences]

                for en, zh in zip(sentences, translated_sentences):
                    output += f"{en}\n{zh}\n\n"
            else:
                output += "\n".join(sentences)

            # 保存结果
            output_dir = "results"
            os.makedirs(output_dir, exist_ok=True)
            base_name = os.path.splitext(os.path.basename(self.file_path))[0]
            output_path = os.path.join(output_dir, f"{base_name}_transcription.txt")

            with open(output_path, "w", encoding="utf-8") as f:
                f.write(output)

            self.finished.emit(output, output_path)

        except Exception as e:
            self.error.emit(str(e))


class TranscriptionApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("语音识别 + 翻译助手(多线程+语言选择)")
        self.setGeometry(300, 300, 620, 500)

        self.layout = QVBoxLayout()

        self.label = QLabel("请选择音频/视频文件:")
        self.layout.addWidget(self.label)

        self.result_box = QTextEdit()
        self.result_box.setReadOnly(True)
        self.layout.addWidget(self.result_box)

        # 源语言选择
        self.source_lang_box = QComboBox()
        self.source_lang_box.addItem("自动检测语言", "auto")
        for name, code in LANGUAGES.items():
            self.source_lang_box.addItem(name, code)
        self.layout.addWidget(QLabel("原始语言(Whisper识别语言):"))
        self.layout.addWidget(self.source_lang_box)

        # 目标语言选择
        self.target_lang_box = QComboBox()
        for name, code in LANGUAGES.items():
            self.target_lang_box.addItem(name, code)
        self.target_lang_box.setCurrentText("中文 (Chinese)")
        self.layout.addWidget(QLabel("翻译目标语言:"))
        self.layout.addWidget(self.target_lang_box)

        # 是否翻译的复选框
        self.translate_checkbox = QCheckBox("是否翻译识别结果")
        self.translate_checkbox.setChecked(True)
        self.layout.addWidget(self.translate_checkbox)

        self.select_button = QPushButton("选择文件")
        self.select_button.clicked.connect(self.select_audio)
        self.layout.addWidget(self.select_button)

        self.transcribe_button = QPushButton("开始识别")
        self.transcribe_button.clicked.connect(self.transcribe_and_translate)
        self.layout.addWidget(self.transcribe_button)

        self.setLayout(self.layout)
        self.audio_path = None
        self.worker = None

    def select_audio(self):
        path, _ = QFileDialog.getOpenFileName(
            self, "选择音频/视频文件", "", "音频/视频文件 (*.mp3 *.wav *.m4a *.flac *.mp4)")
        if path:
            self.audio_path = path
            self.label.setText(f"已选择:{os.path.basename(path)}")
            self.result_box.setPlainText("")

    def transcribe_and_translate(self):
        if not self.audio_path:
            QMessageBox.warning(self, "警告", "请先选择一个文件!")
            return

        source_lang = self.source_lang_box.currentData()
        target_lang = self.target_lang_box.currentData()
        translate_enabled = self.translate_checkbox.isChecked()

        self.result_box.setPlainText("🎧 正在识别中,请稍候...")
        self.transcribe_button.setEnabled(False)

        self.worker = TranscriptionWorker(
            self.audio_path, source_lang, target_lang, translate_enabled
        )
        self.worker.finished.connect(self.on_result)
        self.worker.error.connect(self.on_error)
        self.worker.start()

    def on_result(self, result_text, save_path):
        self.result_box.setPlainText(result_text)
        self.transcribe_button.setEnabled(True)
        QMessageBox.information(self, "完成", f"✅ 操作完成,已保存到:\n{save_path}")

    def on_error(self, error_msg):
        self.result_box.setPlainText("")
        self.transcribe_button.setEnabled(True)
        QMessageBox.critical(self, "错误", f"❌ 错误:\n{error_msg}")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TranscriptionApp()
    window.show()
    sys.exit(app.exec_())
相关推荐
Luke Ewin11 天前
一个基于OpenAI Whisper开发的音视频字幕文件生成工具
人工智能·whisper·音视频·语音识别·asr·语音转写·视频字幕生成
Encarta199317 天前
【语音识别】vLLM 部署 Whisper 语音识别模型指南
人工智能·whisper·语音识别
JHC00000018 天前
ubuntu 下调用系统麦克风,以及faster-whisper-medium 处理音频转写文本
ubuntu·whisper·音视频
西西弗Sisyphus19 天前
whisper 语音识别
whisper·语音识别
JHC00000020 天前
docker 中跑faster-whisper 教程(1050显卡)
docker·容器·whisper·语音识别
engchina1 个月前
vLLM 部署 openai whisper 模型实现语音转文字
人工智能·python·whisper
gs801401 个月前
Faster-Whisper —— 为语音识别加速的利器
人工智能·whisper·语音识别
charles_vaez1 个月前
开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(五)
深度学习·whisper·aigc
Mark White1 个月前
开箱即用的whisper-service服务
whisper