基于whisper和ffmpeg语音转文本小程序
目录
一、环境准备
✅ 第一步:安装并准备 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 Prompt 或 CMD 命令行,依次输入以下命令:
# 创建一个新环境,名字叫 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:
-
访问:https://www.gyan.dev/ffmpeg/builds/
-
下载 “Release full” 版本(Zip 文件)
-
解压到任意文件夹,例如:
C:\ffmpeg
-
把
C:\ffmpeg\bin
添加到系统环境变量 Path 中:-
搜索“环境变量” → 编辑系统变量 → 找到
Path
→ 添加C:\ffmpeg\bin
-
验证成功:打开新的命令行窗口,输入:
ffmpeg -version
二、编写代码实现语音转文本功能
✅ 第一步:创建并运行 Whisper 脚本
-
在当前目录创建
whisper_transcribe_gpu.py
,填入以下代码:
import whisper
import osdef transcribe_audio(file_path, model_size="large"):if not os.path.isfile(file_path):print("❌ 找不到文件:", file_path)returnprint(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"])
总结底层流程:
-
加载预训练模型(初始化模型参数和结构)
-
读取并预处理音频数据
-
使用模型进行声学特征提取和文本解码
-
输出文字识别结果
-
将结果保存到文件。
三、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 Translate
或 deep-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_pathself.source_lang = source_langself.target_lang = target_langself.translate_enabled = translate_enableddef 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 = Noneself.worker = Nonedef select_audio(self):path, _ = QFileDialog.getOpenFileName(self, "选择音频/视频文件", "", "音频/视频文件 (*.mp3 *.wav *.m4a *.flac *.mp4)")if path:self.audio_path = pathself.label.setText(f"已选择:{os.path.basename(path)}")self.result_box.setPlainText("")def transcribe_and_translate(self):if not self.audio_path:QMessageBox.warning(self, "警告", "请先选择一个文件!")returnsource_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_())