今天要一個非常好的朋友有個工作,就是要把醫院醫生診斷的說話記錄轉成文字,之前都是她本人一句一句的聽,然后記錄下來的,我想通過ai 來解決這個問題。
她的需求如下:
- 不能把數據傳到網上,隱私問題所以需要本地部署
- 不能成本太高要不然就沒意義了,所以希望一般的電腦能跑起來,最少最新的mac能跑起來
- 最好容易上手的不要有學習成本
據調研要實現這個功能,目前最強大且最方便的方案是使用 OpenAI 開發的 Whisper 模型。Whisper 在處理多種語言,甚至是同一句話中夾雜不同語言(例如英語和粵語混合)的場景下,表現非常出色。
這個方案的優點是:
- 免費和開源:你可以在自己的電腦上運行,不需要支付 API 費用。
- 高準確率:對于發音清晰的音頻,轉錄效果非常好。
- 自動語言檢測:你不需要告訴它這是什么語言,它會自動識別并轉錄。
- 支持視頻和音頻:代碼會自動從視頻中提取音軌進行處理。
- 本地運行:保護你的數據隱私。
下面我將為你提供一個完整的、可運行的 Python 代碼,并詳細解釋如何設置環境和使用它。
第一步:環境準備
在運行代碼之前,你需要安裝一些必要的軟件和 Python 庫。
-
安裝 Python
如果你的電腦還沒有 Python,請先從 python.org 下載并安裝最新版本的 Python (例如 3.9+)。 -
安裝 FFmpeg
Whisper 和處理視頻的庫需要ffmpeg
這個強大的音視頻處理工具。- Windows: 從 FFmpeg 官網 下載,解壓后將其
bin
目錄的路徑添加到系統的環境變量PATH
中。 - macOS: 使用 Homebrew 安裝:
brew install ffmpeg
- Linux (Ubuntu/Debian): 使用 apt 安裝:
sudo apt update && sudo apt install ffmpeg
- Windows: 從 FFmpeg 官網 下載,解壓后將其
-
安裝 Python 庫
打開你的終端(Terminal)或命令提示符(Command Prompt),運行以下命令來安裝所有需要的庫:pip install openai-whisper moviepy torch
openai-whisper
: 核心的語音轉文字庫。moviepy
: 用于從視頻文件中提取音頻。torch
: Whisper 依賴的深度學習框架。
第二步:Python 代碼
將下面的代碼保存為一個 Python 文件,例如 transcribe.py
。
import os
import whisper
import moviepy.editor as mp
import argparse
import torchdef transcribe_mixed_language_audio(file_path: str, model_size: str = "medium"):"""轉錄包含英語和粵語混合的音頻或視頻文件。參數:file_path (str): 輸入的視頻或音頻文件路徑。model_size (str): 要使用的 Whisper 模型大小 (例如 "tiny", "base", "small", "medium", "large")。"""# 檢查文件是否存在if not os.path.exists(file_path):print(f"錯誤:文件 '{file_path}' 不存在。")return# 檢查是否有可用的 GPUdevice = "cuda" if torch.cuda.is_available() else "cpu"print(f"將使用 '{device}' 設備進行轉錄。")# --- 1. 如果是視頻文件,先提取音頻 ---is_video = file_path.lower().endswith(('.mp4', '.mov', '.avi', '.mkv'))audio_path = file_pathtemp_audio_file = Noneif is_video:print(f"檢測到視頻文件,正在提取音頻...")try:video_clip = mp.VideoFileClip(file_path)# 創建一個臨時的音頻文件名base_name = os.path.splitext(os.path.basename(file_path))[0]temp_audio_file = f"temp_audio_{base_name}.mp3"video_clip.audio.write_audiofile(temp_audio_file)audio_path = temp_audio_fileprint(f"音頻已成功提取到 '{audio_path}'")except Exception as e:print(f"提取音頻時出錯: {e}")return# --- 2. 加載 Whisper 模型并進行轉錄 ---try:print(f"正在加載 Whisper 模型 '{model_size}'... (初次加載可能需要下載模型,請耐心等待)")model = whisper.load_model(model_size, device=device)print("模型加載完成,開始轉錄音頻... (這可能需要很長時間,取決于文件大小和你的電腦性能)")# 轉錄時指定 language=None,讓 Whisper 自動檢測語言result = model.transcribe(audio_path, language=None, fp16=torch.cuda.is_available())transcribed_text = result["text"]print("\n--- 轉錄完成 ---\n")print(transcribed_text)# --- 3. 將結果保存到文本文件 ---output_txt_path = os.path.splitext(file_path)[0] + ".txt"with open(output_txt_path, 'w', encoding='utf-8') as f:f.write(transcribed_text)print(f"\n轉錄結果已保存到: {output_txt_path}")except Exception as e:print(f"轉錄過程中發生錯誤: {e}")finally:# --- 4. 清理臨時文件 ---if temp_audio_file and os.path.exists(temp_audio_file):os.remove(temp_audio_file)print(f"已刪除臨時音頻文件: {temp_audio_file}")if __name__ == "__main__":parser = argparse.ArgumentParser(description="將英語/粵語混合的視頻或音頻文件轉錄為文字。")parser.add_argument("file", type=str, help="要轉錄的視頻或音頻文件路徑。")parser.add_argument("--model", type=str, default="medium", choices=["tiny", "base", "small", "medium", "large", "large-v2", "large-v3"],help="選擇要使用的 Whisper 模型大小 (默認為 'medium')。")args = parser.parse_args()transcribe_mixed_language_audio(args.file, args.model)
第三步:如何運行代碼
-
準備文件:將你要轉錄的視頻(例如
my_cantonese_video.mp4
)或音頻(例如my_cantonese_audio.mp3
)文件放在與transcribe.py
相同的文件夾下,或者記住它的完整路徑。 -
打開終端/命令提示符:導航到你保存
transcribe.py
的文件夾。 -
執行命令:
-
基本用法(處理視頻):
python transcribe.py my_cantonese_video.mp4
-
處理音頻文件:
python transcribe.py my_cantonese_audio.mp3
-
選擇不同大小的模型 (例如使用
large-v3
模型以獲得更高精度):python transcribe.py my_cantonese_video.mp4 --model large-v3
-
運行過程說明:
- 程序首先會檢查你提供的是視頻還是音頻。
- 如果是視頻,它會先提取音頻,并保存為一個臨時的
.mp3
文件。 - 接著,它會加載 Whisper 模型。第一次運行某個模型時,程序會自動下載模型文件,可能需要幾分鐘。
- 然后,它會開始轉錄,這個過程可能非常耗時,具體時間取決于你的電腦性能(CPU/GPU)和文件時長。
- 轉錄完成后,它會在屏幕上打印出結果,并同時將結果保存到一個與原文件同名的
.txt
文件中。 - 最后,它會自動刪除之前創建的臨時音頻文件。
模型選擇和性能建議
Whisper 提供了不同大小的模型,這直接影響到速度和準確率:
模型 (--model ) | 參數量 | 速度 | 準確率 | 推薦場景 |
---|---|---|---|---|
tiny | ~39M | 最快 | 一般 | 快速預覽,對準確率要求不高 |
base | ~74M | 很快 | 較好 | 純凈背景下的標準語音 |
small | ~244M | 中等 | 好 | 通用場景,性能和效果的平衡點 |
medium | ~769M | 較慢 | 很好 | 強烈推薦用于混合語言或有噪音的場景 |
large-v3 | ~1.55B | 最慢 | 最佳 | 追求最高準確率,且有耐心或有好的硬件 |
-
對于英語和粵語混合的場景,建議至少使用
medium
模型,因為它在處理多語言和口音方面表現更穩定。如果你的電腦配置很好(特別是擁有 NVIDIA 顯卡),使用large-v3
模型會得到最佳效果。 -
GPU 加速:如果你有 NVIDIA 顯卡并且正確安裝了 CUDA,代碼會自動使用 GPU 進行計算,速度會比用 CPU 快幾十倍。如果沒有,它會回退到使用 CPU,速度會慢很多。
-
補充升級后的 whisper-ctranslate2 your_audio_file.m4a --device cpu --model large-v3