基于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 Prompt 或 CMD 命令行,依次输入以下命令:
# 创建一个新环境,名字叫 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:
-
访问: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 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\"])
总结底层流程:
-
加载预训练模型(初始化模型参数和结构)
-
读取并预处理音频数据
-
使用模型进行声学特征提取和文本解码
-
输出文字识别结果
-
将结果保存到文件。
三、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 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_())