> 技术文档 > 基于whisper和ffmpeg语音转文本小程序_美化路径.txt

基于whisper和ffmpeg语音转文本小程序_美化路径.txt

目录

一、环境准备

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

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

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

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

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

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

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

✅ 第二步:转录完成!🎉

✅ 注意事项:

1. import whisper

2. file_path = r\"...\"

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

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

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

总结底层流程:

三、TXT格式美化

四、例句对照翻译

五、常见报错

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

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


一、环境准备

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

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

推荐下载 Miniconda(轻量)
👉 Miniconda 官网下载地址
下载 Windows 64-bit 安装版并安装(默认设置即可)。

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

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

# 创建一个新环境,名字叫 whisper_env,使用 Python 3.10conda 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.gitpip 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 whisperimport osdef 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 whisperfile_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\"])

  • 这两行是将识别结果文本打印到控制台。

6. 保存识别结果到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 whisperfile_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 whisperfrom deep_translator import GoogleTranslatorimport 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 sysimport osfrom PyQt5.QtWidgets import ( QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QFileDialog, QTextEdit, QMessageBox, QComboBox, QCheckBox)from PyQt5.QtCore import QThread, pyqtSignalimport whisperfrom 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_())