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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux GPIO驱动开发实战:Poll与异步通知双机制详解

1. 引言 在嵌入式Linux开发中,GPIO按键驱动是最基础也最典型的案例之一。本文将基于一个支持poll和异步通知双机制的GPIO驱动框架,深入剖析以下核心内容: GPIO中断与防抖处理环形缓冲区设计Poll机制实现异步通知(SIGIO)实现应用层交互方式 …

【最新版】西陆健身系统源码全开源+uniapp前端

一.系统介绍 一款基于UniappThinkPHP开发健身系统,支持多城市、多门店,包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型,支持在线排课。私教可以通过上课获得收益,在线申请提现功能,无…

济南国网数字化培训班学习笔记-第二组-6-输电线路现场教学

输电线路现场教学 杆塔组装 角钢塔 角钢-连扳-螺栓 螺栓(M): 脚钉-螺栓(螺栓头-无扣长-螺纹-螺帽)-垫片-螺帽/防盗帽/防松帽M20*45 表示直径20mm,长度45mm螺栓级别由一个类似浮点数表示,如…

抖音的逆向工程获取弹幕(websocket和protobuf解析)

目录 声明前言第一节 获取room_id和ttwid值第二节 signture值逆向python 实现signature第三节 Websocket实现长链接请求protubuf反序列化pushFrame反序列化Response解压和反序列化消息体Message解析应答ack参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…

反射,枚举,lambda表达式

目录 反射枚举的使用Lambda表达式函数式接口语法Lambda表达式语法精简 变量捕获Lambda在集合List中的使用 反射 作用:在Java代码中,让一个对象认识到自己 比如一个类的名字,里面的方法,属性等 让程序运行的过程,某个对…

鸿蒙移动应用开发--渲染控制实验

任务:使用“对象数组”、“ForEach渲染”、“Badge角标组件”、“Grid布局”等相关知识,实现生效抽奖卡案例。如图1所示: 图1 生肖抽奖卡实例图 图1(a)中有6张生肖卡可以抽奖,每抽中一张,会通过弹层显示出来&#xf…

webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)

目录 1、webpack简介2、简单示例3、入口(entry)和输出(output)4、自动生成html文件5、打包css代码6、优化(单独提取css代码)7、优化(压缩过程)8、打包less代码9、打包图片10、搭建开发环境(webpack-dev-server&#xf…

Java快速上手之实验4(接口回调)

1.编写接口程序RunTest.java,通过接口回调实现多态性。解释【代码4】和【代码6】的执行结果为何不同? interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("猫急上树.."…

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型(LLM)的蓬勃发展,其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源(尤其是 GPU)的巨大需求、分布式任务固有的复杂依…

Qwen2.5简要全流程以及QA

1 输入prompt 得到input id input id: [B,L] # batch size , lenth 2 embeding之后得到 input_embeds: [B,L,D] # demensions 3 进入Transformer层 先通过linear层得到shape不变的 QKV 多头注意力 分割Dimension , kv变成 [B,H,L,head_dim] h是…

爬虫学习——Item封装数据与Item Pipeline处理数据

一、Item封装数据 对于有字段的数据,最好的数据结构维护方法为字典类型(dict),但是由于字典不便于携带元数据和传递给其他组件使用,故可以使用Item类封装爬取到的数据。 这里涉及两个类:Item基类和Field类 两者的使用关系如下&…

【React】状态管理 Context API \ MobX \ Redux

Context APIMobXRedux React有自己状态管理,周边生态也有很多状态管理 Context API 直接从react中引入并调用即可,context包含两个东西: Provider:提供商(翻译),提供数据;属性&…

RK3588上编译opencv 及基于c++实现图像的读入

参考博文: https://blog.csdn.net/qq_47432746/article/details/147203889 一、安装依赖包 sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpe…

MATLAB 训练CNN模型 yolo v4

学生对小车控制提出了更好的要求,能否加入深度学习模型。 考虑到小车用matlab来做,yolo v5及以上版本都需要在pytorch下训练,还是用早期版本来演示。 1 yolov4 调用 参考 trainYOLOv4ObjectDetector (mathworks.com) name "tiny-yo…

Windows下使用 VS Code + g++ 开发 Qt GUI 项目的完整指南

🚀 使用 VS Code g 开发 Qt GUI 项目的完整指南(Windows MSYS2) 本指南帮助你在 Windows 下使用 VS Code g CMake Qt6 快速搭建 Qt GUI 项目,适合熟悉 Visual Studio 的开发者向跨平台 VS Code 工具链迁移。 🛠️…

开源漏洞扫描器:OpenVAS

一、OpenVAS介绍 OpenVAS (Open Vulnerability Assessment System) 是一款功能强大的开源漏洞扫描器。它由 Greenbone Networks 开发和维护,是 Greenbone 安全管理器 (GSM) 产品的基础,同时也有免费的社区版本(Greenbone Community Edition&…

Redis Pipeline 详解

Redis Pipeline 详解 Redis 无 Pipeline 耗时情况 : #mermaid-svg-8RIiJyeBO0uIrWjr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8RIiJyeBO0uIrWjr .error-icon{fill:#552222;}#mermaid-svg-8RIiJyeBO0uIrWjr .…

2025.04.24【3D】3D绘图入门指南

Nifty graph A contribution by Matt Asher. 3D animation A 3D animated scatterplot made with R and rgl. 文章目录 Nifty graph3D animation 2025.04.24【3D】| 3D绘图入门指南什么是3D绘图?为什么使用3D绘图?如何在R中进行3D绘图?安装…

[特殊字符] 分布式事务中,@GlobalTransactional 与 @Transactional 到底怎么配合用?

在微服务架构中,随着系统模块的拆分,单体应用中的本地事务已经无法满足跨服务的数据一致性需求。此时,我们就需要引入分布式事务解决方案,比如 Seata。在使用 Seata 的过程中,很多人会遇到一个常见的疑问: …

TDengine 集群高可用方案设计(二)

四、TDengine 集群高可用方案设计 4.1 硬件与网络架构设计 服务器选型:选择配置高、稳定性强的服务器,如戴尔 PowerEdge R740xd、华为 RH2288H V5 等。以戴尔 PowerEdge R740xd 为例,它配备英特尔至强可扩展处理器,具备高性能计…