当前位置: 首页 > news >正文

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

总结底层流程:

  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 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_())

 

相关文章:

  • https nginx 负载均衡配置
  • OpenCV 图形API(61)图像特征检测------检测图像边缘的函数Canny()
  • Qt5.15.2+OpenCV4.9.0开发环境搭建详细图文教程(OpenCV使用Qt自带MinGW编译的全过程,包教包会)
  • AWS 中国区 CloudFront SSL 证书到期更换实战指南
  • 第六章 QT基础:5、QT的UDP网络编程
  • 详解Linux中的定时任务管理工具crond
  • 使用 Node、Express 和 MongoDB 构建一个项目工程
  • FastMCP与FastAPI:构建自定义MCP服务器
  • 入门 Go 语言
  • Java 2025 技术全景与实战指南:从新特性到架构革新
  • 十分钟恢复服务器攻击——群联AI云防护系统实战
  • LLMind:利用大型语言模型协调人工智能与物联网以执行复杂任务
  • 全行业软件定制:APP/小程序/系统开发与物联网解决方案
  • 面阵相机中M12镜头和远心镜头的区别及性能优势
  • Linux下编译opencv-4.10.0(静态链接库和动态链接库)
  • Vivado版本升级后AXI4-Stream Data FIFO端口变化
  • centos7使用yum快速安装最新版本Jenkins-2.462.3
  • IDEA将本地的JAR文件手动安装到 Maven的本地仓库
  • AI日报 - 2025年04月25日
  • 数据库day-07
  • 《哪吒之魔童降世》电影版权方诉《仙侠神域》游戏运营方侵权案开庭
  • “家门口的图书馆”有多好?上海静安区居民给出答案
  • 龙头券商哪家强:中信去年营收领跑,中金净利下滑
  • 一夜跌去200美元,黄金巨震冲上热搜!涨势已近尾声?
  • 郑庆华任同济大学党委书记
  • 光影连接世界,中国企业出海绘就城市新名片