今天要一个非常好的朋友有个工作,就是要把医院医生诊断的说话记录转成文字,之前都是她本人一句一句的听,然后记录下来的,我想通过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),运行以下命令来安装所有需要的库:
bashpip install openai-whisper moviepy torch
openai-whisper
: 核心的语音转文字库。moviepy
: 用于从视频文件中提取音频。torch
: Whisper 依赖的深度学习框架。
第二步:Python 代码
将下面的代码保存为一个 Python 文件,例如 transcribe.py
。
python
import os
import whisper
import moviepy.editor as mp
import argparse
import torch
def 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
# 检查是否有可用的 GPU
device = "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_path
temp_audio_file = None
if 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_file
print(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
的文件夹。 -
执行命令:
-
基本用法(处理视频):
bashpython transcribe.py my_cantonese_video.mp4
-
处理音频文件:
bashpython transcribe.py my_cantonese_audio.mp3
-
选择不同大小的模型 (例如使用
large-v3
模型以获得更高精度):bashpython 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