赞
踩
虽然已经很简单了,但是对于程序员来说还是不够简洁,毕竟程序员都很“懒”,Whisper 虽说安装和调用已经很简单了,但还是需要独立安装 PyTorch 、ffmpeg 甚至 Rust。
将音视频文件中的音频转为文字内容,这个需求放到两年前还不大好实现,但是放到今天,几分钟就解决了。
听说有的公司为了抓取训练数据,已经把抖音、快手这些短视频平台上的视频扒了个遍,然后将其中的音频提取成文本,用作大数据模型的训练语料。
如果你有将视频或音频文件转文字的需要,不妨试一试今天提供的这个开源方案。比如搜索影视台词出现的时间点。
话不多说,进入正题。
这个方案就是 OpenAI 开源的 Whisper,当然是用 Python 写的了,只需要简单安装几个包,然后几行代码一写,稍等片刻(根据你的机器性能和音视频长度不一),最终的文本内容就出来了,就是这么简单。
GitHub 仓库地址:https://github.com/openai/whisper
虽然已经很简单了,但是对于程序员来说还是不够简洁,毕竟程序员都很“懒”,Whisper 虽说安装和调用已经很简单了,但还是需要独立安装 PyTorch 、ffmpeg 甚至 Rust。
于是,就有了更快、更简洁的 Fast-Whisper。Fast-Whisper 并不是简单封装了一下 Whisper,而是是使用 CTranslate2 重新实现 OpenAI 的 Whisper 模型,CTranslate2 是 Transformer 模型的快速推理引擎。
总结一下,也就是比 Whisper 更快,官方的说法是比 Whisper 快了 4-8 倍。不仅能支持 GPU ,还能支持 CPU,连我这台破 Mac 也能用。
GitHub 仓库地址:https://github.com/SYSTRAN/faster-whisper
使用起来就两步。
pip install faster-whisper
- from faster_whisper import WhisperModel
-
- model_size = "large-v3"
-
- # Run on GPU with FP16
- model = WhisperModel(model_size, device="cuda", compute_type="float16")
-
- # or run on GPU with INT8
- # model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
- # or run on CPU with INT8
- # model = WhisperModel(model_size, device="cpu", compute_type="int8")
-
- segments, info = model.transcribe("audio.mp3", beam_size=5)
-
- print("Detected language '%s' with probability %f" % (info.language, info.language_probability))
-
- for segment in segments:
- print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
没错,就是这么简单。
正好有个朋友想做短视频,发一些鸡汤文学的视频,鸡汤就来自于一些名家访谈的视频。但是,他又不想把完整的视频看一遍,就想用最快的方式把文本内容弄下来,然后读文字,因为读文字要比看一篇视频快的多,而且还可以搜索。
我就说,连完整的看一篇视频的虔诚之心都没有,能经营好账号吗。
于是我给他做了一个,就是用的 Fast-Whisper。
客户端用 Swift ,只支持 Mac 端。
,时长00:10
服务端当然就是 Python ,然后用 Flask 包装一下,对外放开接口。
- from flask import Flask, request, jsonify
- from faster_whisper import WhisperModel
-
- app = Flask(__name__)
-
- model_size = "large-v2"
- model = WhisperModel(model_size, device="cpu", compute_type="int8")
-
-
- @app.route('/transcribe', methods=['POST'])
- def transcribe():
- # Get the file path from the request
- file_path = request.json.get('filePath')
-
- # Transcribe the file
- segments, info = model.transcribe(file_path, beam_size=5, initial_prompt="简体")
- segments_copy = []
- with open('segments.txt', 'w') as file:
- for segment in segments:
- line = "%.2fs|%.2fs|[%.2fs -> %.2fs]|%s" % (
- segment.start, segment.end, segment.start, segment.end, segment.text)
- segments_copy.append(line)
- file.write(line + '\n')
-
- # Prepare the response
- response_data = {
- "language": info.language,
- "language_probability": info.language_probability,
- "segments": []
- }
-
- for segment in segments_copy:
- response_data["segments"].append(segment)
-
- return jsonify(response_data)
-
-
- if __name__ == '__main__':
- app.run(debug=False)
以上就是个抛砖引玉的小工具,留着自己用用也足够了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。