基于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.pswp.cn/bicheng/78261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78261.shtml
英文地址,請注明出處:http://en.pswp.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 為例,它配備英特爾至強可擴展處理器,具備高性能計…