真快!幾分鐘就把視頻語(yǔ)音識(shí)別為文本了,不到10行代碼
大家好,我是風(fēng)箏
將音視頻文件中的音頻轉(zhuǎn)為文字內(nèi)容,這個(gè)需求放到兩年前還不大好實(shí)現(xiàn),但是放到今天,幾分鐘就解決了。
聽(tīng)說(shuō)有的公司為了抓取訓(xùn)練數(shù)據(jù),已經(jīng)把抖音、快手這些短視頻平臺(tái)上的視頻扒了個(gè)遍,然后將其中的音頻提取成文本,用作大數(shù)據(jù)模型的訓(xùn)練語(yǔ)料。
如果你有將視頻或音頻文件轉(zhuǎn)文字的需要,不妨試一試今天提供的這個(gè)開(kāi)源方案。比如搜索影視臺(tái)詞出現(xiàn)的時(shí)間點(diǎn)。
話不多說(shuō),進(jìn)入正題。
Whisper
這個(gè)方案就是 OpenAI 開(kāi)源的 Whisper,當(dāng)然是用 Python 寫的了,只需要簡(jiǎn)單安裝幾個(gè)包,然后幾行代碼一寫,稍等片刻(根據(jù)你的機(jī)器性能和音視頻長(zhǎng)度不一),最終的文本內(nèi)容就出來(lái)了,就是這么簡(jiǎn)單。
GitHub 倉(cāng)庫(kù)地址:https://github.com/openai/whisper
Fast-Whisper
雖然已經(jīng)很簡(jiǎn)單了,但是對(duì)于程序員來(lái)說(shuō)還是不夠簡(jiǎn)潔,畢竟程序員都很“懶”,Whisper 雖說(shuō)安裝和調(diào)用已經(jīng)很簡(jiǎn)單了,但還是需要獨(dú)立安裝 PyTorch 、ffmpeg 甚至 Rust。
于是,就有了更快、更簡(jiǎn)潔的 Fast-Whisper。Fast-Whisper 并不是簡(jiǎn)單封裝了一下 Whisper,而是是使用 CTranslate2 重新實(shí)現(xiàn) OpenAI 的 Whisper 模型,CTranslate2 是 Transformer 模型的快速推理引擎。
總結(jié)一下,也就是比 Whisper 更快,官方的說(shuō)法是比 Whisper 快了 4-8 倍。不僅能支持 GPU ,還能支持 CPU,連我這臺(tái)破 Mac 也能用。
GitHub 倉(cāng)庫(kù)地址:https://github.com/SYSTRAN/faster-whisper
使用起來(lái)就兩步。
- 安裝依賴包
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))
沒(méi)錯(cuò),就是這么簡(jiǎn)單。
能做什么呢
正好有個(gè)朋友想做短視頻,發(fā)一些雞湯文學(xué)的視頻,雞湯就來(lái)自于一些名家訪談的視頻。但是,他又不想把完整的視頻看一遍,就想用最快的方式把文本內(nèi)容弄下來(lái),然后讀文字,因?yàn)樽x文字要比看一篇視頻快的多,而且還可以搜索。
我就說(shuō),連完整的看一篇視頻的虔誠(chéng)之心都沒(méi)有,能經(jīng)營(yíng)好賬號(hào)嗎。
于是我給他做了一個(gè),就是用的 Fast-Whisper。
客戶端
客戶端用 Swift ,只支持 Mac 端。
- 選則一個(gè)視頻;
- 然后點(diǎn)擊「提取文本」,這時(shí)會(huì)調(diào)用 Python 接口,需要等待一段時(shí)間;
- 加載解析出的文本以及出現(xiàn)的開(kāi)始、截止時(shí)間;
- 選了一個(gè)開(kāi)始時(shí)間和一個(gè)結(jié)束事件;
- 點(diǎn)擊「導(dǎo)出」按鈕,視頻片段就導(dǎo)出了;
,時(shí)長(zhǎng)00:10
服務(wù)端
服務(wù)端當(dāng)然就是 Python ,然后用 Flask 包裝一下,對(duì)外放開(kāi)接口。
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="簡(jiǎn)體")
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)
以上就是個(gè)拋磚引玉的小工具,留著自己用用也足夠了。