Mac语音转录提速40倍 | Distil-Whisper + MLX,快速将音视频转换为文字和字幕
(注意:本文是知识星球的精选内容。如果你已经加入了知识星球“kate的AI星球”,无须重复支付。)
引言
Distil-Whisper 是在论文Robust Knowledge Distillation via Large-Scale Pseudo Labeling(https://arxiv.org/abs/2311.00430)中提出的。
更多介绍: https://huggingface.co/distil-whisper
Distil-Whisper 模型概述
Distil-Whisper V3 是 OpenAI 的Whisper large-v3的知识蒸馏版本,是迄今为止最新、性能最强的 Whisper 模型。
需要注意的是,该模型只支持英文。
如果是中文语音,经它转录后,会变成英文。
如果想要转成其他语言,可以参考这里的训练文档:
https://github.com/huggingface/distil-whisper/tree/main/training
快速开始
今天看到博主Awni Hannun的推文,展示了distil-large-v3配合mlx_whisper的转录,速度超级快。
设备要求:Mac M芯片电脑
模型地址:
https://huggingface.co/mlx-community/distil-whisper-large-v3
对比Groq whisper转录,Distil-Whisper优势是突破25M限制,数据本地处理,支持生成SRT文件。
我用下面脚本测试了下,真的超级快。(第一次运行时,系统会下载1.5G的模型,只要第一次下载模型,后续直接使用)
import mlx_whisper
result = mlx_whisper.transcribe(
"./test.mp4",
path_or_hf_repo="mlx-community/distil-whisper-large-v3",
)
print(result["text"])
运行前,记得先进行以下操作:
安装 ffmpeg
:
# 在 macOS 上使用 Homebrew (https://brew.sh/)
brew install ffmpeg
使用以下命令安装 mlx-whisper
包:
pip install mlx-whisper
如果想知道mlx-whisper有哪些可调整参数,可以运行以下脚本:
import mlx_whisper
help(mlx_whisper.transcribe)
我整理了下主要参数和功能说明如下:
音频输入:
audio
:可以是音频文件路径(字符串)、NumPy数组或MLX数组
模型选择:
path_or_hf_repo
:Whisper模型的本地路径或Hugging Face仓库名称
转录控制参数:
verbose
:是否显示详细输出temperature
:采样温度,可以是单个浮点数或浮点数元组compression_ratio_threshold
:压缩比阈值logprob_threshold
:对数概率阈值no_speech_threshold
:无语音阈值condition_on_previous_text
:是否基于前文条件initial_prompt
:可选的初始提示文本word_timestamps
:是否生成单词级时间戳clip_timestamps
:裁剪时间戳,可以是字符串或浮点数列表hallucination_silence_threshold
:幻听静默阈值
标点符号处理:
prepend_punctuations
:如果启用单词时间戳,这些标点符号将与下一个单词合并append_punctuations
:如果启用单词时间戳,这些标点符号将与前一个单词合并
其他选项:
decode_options
:其他解码选项
特别说明:
函数使用交叉注意力模式和动态时间规整来提取单词级时间戳 initial_prompt
可用于提供转录上下文,如自定义词汇或专有名词,以提高预测准确性时间戳和标点符号的处理可以通过相关参数进行精细控制
可以根据具体需求进行调整。
参数详解
initial_prompt
参数
可以这样设置
专业领域:
initial_prompt = "The following is a technical discussion about artificial intelligence and machine learning."
特定场景:
initial_prompt = "This is a news broadcast audio, which may cover current events and economics."
专有名词或技术术语:
initial_prompt = "The audio may contain the following technical terms: deep learning, convolutional neural networks, BERT, GPT, tensor."
特定人名或地名:
initial_prompt = "The conversation may mention the following names and places: Shakespeare, Newton, London, Oxford."
音频质量提示:
initial_prompt = "This is a recording with significant background noise, and the speakers may use professional terminology."
多语言环境:
initial_prompt = "This audio contains a mixed-language dialogue, mainly discussing international trade topics."
特定格式:
initial_prompt = "This is a recorded phone interview, including dialogue between the interviewer and the interviewee."
历史或文化背景:
initial_prompt = "This is a lecture about ancient history, involving many historical names, places, and events."
数字和单位:
initial_prompt = "The audio contains a lot of numerical information, possibly involving percentages, currency units such as dollars and euros."
科学背景:
initial_prompt = "This is a discussion about recent advancements in quantum physics and their potential applications in computing."
使用 initial_prompt
时的一些建议:
保持简洁:通常一两句话就足够了。 相关性:尽量提供与音频内容直接相关的信息。 避免误导:不要在 prompt 中加入音频中不存在的信息,这可能导致错误的转录。 测试不同版本:可以尝试不同的 prompt,看哪个能得到最好的结果。
小tip:
在为 Whisper 模型设置初始提示 (Prompt) 时,加入几句标点正确、语义完整的句子作为示例,有助于模型更好地学习如何对语音进行断句。
temperature
参数
采样温度,可以是单个浮点数或浮点数元组
实际我转录一段英文,temperature分别设置为0、0.5、1,转录后的文字是一样的,这和我之前介绍的Groq里的whisper转录不同。
condition_on_previous_text
参数
参数用于控制模型在转录时是否考虑先前转录的文本内容。这个功能对于提高长音频文件的转录一致性和连贯性特别有用。
基本用法:
result = mlx_whisper.transcribe(
"your_audio.mp3",
path_or_hf_repo="mlx-community/distil-whisper-large-v3",
condition_on_previous_text=True # 默认值通常为 True
)功能说明:
当设置为 True
时,模型会考虑之前转录的文本内容来预测下一段文本。当设置为 False
时,模型会独立处理每个音频段落,不考虑之前的转录结果。
使用场景:
长音频文件:对于长时间的演讲、访谈或会议记录,启用此选项可以帮助保持上下文的连贯性。 专业术语:如果音频中包含特定领域的术语,启用此选项可以帮助模型在整个文档中一致地识别这些术语。 说话者风格:有助于捕捉和保持特定说话者的语言风格和表达方式。
结合其他参数:
可以与 initial_prompt
结合使用,为模型提供更多上下文信息:
result = mlx_whisper.transcribe(
"your_audio.mp3",
path_or_hf_repo="mlx-community/distil-whisper-large-v3",
condition_on_previous_text=True,
initial_prompt="This is a technical discussion about AI and machine learning."
)
word_timestamps
参数
参数用于控制是否生成单词级别的时间戳。这个功能对于需要精确定位音频中特定单词或短语位置的应用场景非常有用。
基本用法:
result = mlx_whisper.transcribe(
"your_audio.mp3",
path_or_hf_repo="mlx-community/distil-whisper-large-v3",
word_timestamps=True # 默认值通常为 False
)功能说明:
当设置为 True
时,转录结果会包含每个单词的开始和结束时间。当设置为 False
时,只会生成句子或段落级别的时间戳。
访问时间戳信息: 启用此选项后,可以通过以下方式访问单词级时间戳:
for segment in result["segments"]:
for word in segment["words"]:
print(f"Word: {word['word']}, Start: {word['start']:.2f}s, End: {word['end']:.2f}s")
使用场景:
字幕生成:为视频创建精确的逐字字幕。 音频搜索:能够精确定位音频中的特定单词或短语。 语音分析:研究说话者的语速、停顿等特征。 音频编辑:精确剪辑或编辑音频内容。
处理时间戳数据: 获取时间戳后,你可以进行各种操作,例如:
创建互动式转录文本,点击单词跳转到音频相应位置。 分析说话者的语速变化。 生成词云图,显示单词出现的频率和时间分布。
注意事项:
时间戳的精确度可能会受到音频质量、说话速度、背景噪音等因素的影响。 对于某些语言(尤其是声调语言或单词边界不明显的语言),单词级时间戳可能不如其他语言准确。
实践应用
将文件转录为字幕的完整代码
import mlx_whisper
result = mlx_whisper.transcribe(
"./test.mp4",
path_or_hf_repo="mlx-community/distil-whisper-large-v3",
verbose=True,
)
# 将结果转换为 SRT 格式
srt_content = ""
for i, segment in enumerate(result["segments"]):
start_time = segment["start"]
end_time = segment["end"]
text = segment["text"]
# 将时间转换为 SRT 格式
start_time_srt = f"{int(start_time // 3600):02d}:{int(start_time % 3600 // 60):02d}:{int(start_time % 60):02d},{int(start_time * 1000 % 1000):03d}"
end_time_srt = f"{int(end_time // 3600):02d}:{int(end_time % 3600 // 60):02d}:{int(end_time % 60):02d},{int(end_time * 1000 % 1000):03d}"
srt_content += f"{i+1}\n"
srt_content += f"{start_time_srt} --> {end_time_srt}\n"
srt_content += f"{text}\n\n"
# 将 SRT 内容保存到文件
with open("output.srt", "w", encoding="utf-8") as f:
f.write(srt_content)
print("SRT 字幕文件已保存到 output.srt")
单词级别的时间戳
import mlx_whisper
result = mlx_whisper.transcribe(
"./test.mp4",
path_or_hf_repo="mlx-community/distil-whisper-large-v3",
word_timestamps=True
)
# 遍历所有段落
# for i, segment in enumerate(result["segments"]):
# print(f"\nSegment {i + 1}:")
# print(segment["words"])
# 如果你想要更详细的输出,可以使用以下代码:
for i, segment in enumerate(result["segments"]):
print(f"\nSegment {i + 1}:")
for word in segment["words"]:
print(f"Word: {word['word']:<20} Start: {word['start']:.2f}s End: {word['end']:.2f}s")
图形界面工具推荐
如果习惯用GUI应用,这里推荐一个Github仓库
https://github.com/RayFernando1337/MLX-Auto-Subtitled-Video-Generator
那有没有办法,在你电脑上,针对要转录的音频或视频文件,一键就能转录并获得txt和srt文件呢?
有,请看下文,我将详细介绍。