原文轉載自「劉悅的技術博客」https://v3u.cn/a_id_169html
爲影片加字幕實際上是一件很是耗費時間的事情,尤爲是對於打字慢的朋友來講。固然不光爲影片加字幕,在其餘領域,相似的逐字稿也是工做中避免不了的內容。好比寫論文,若是內容中有訪談,就必需要附上逐字稿,又或者是會議的記錄等等。本次使用基於Python3的AutoSub庫對實時語音進行識別,而後再經過GoogleTranslation的在線API接口對語音識別後的內容進行翻譯,這樣就能夠獲得一份雙語字幕(逐字稿),這裏的雙語不僅針對國語+英語組合,也能夠包含其餘國家,包括小語種地區,很是方便。python
首先須要安裝ffmpeg,這個軟件在以前有過介紹:Python3利用ffmpeg針對視頻進行一些操做,Win10用戶能夠根據這篇文章進行安裝,若是是Mac用戶則很是簡單,使用Homebrew就能夠很是方便的進行安裝git
brew install ffmpeg
其後安裝autosub,這個庫其實就是針對Google的語音識別封裝而成的,最先基於Python2,近幾年也出現不少「魔改版」,這裏推薦儘可能安裝原版的基於Python3的最新版,而使用pip直接install每每沒法安裝最新版,因此這裏推薦用git版本庫地址的方式進行安裝,這樣能夠避免不少坑:github
pip3 install git+https://github.com/agermanidis/autosub.git
安裝成功後,輸入命令:json
autosub -h
就能夠看到使用說明:api
liuyue:myr liuyue$ autosub -h
usage: autosub [-h] [-C CONCURRENCY] [-o OUTPUT] [-F FORMAT] [-S SRC_LANGUAGE]
[-D DST_LANGUAGE] [-K API_KEY] [--list-formats]
[--list-languages]
[source_path]positional arguments:
source_path Path to the video or audio file to subtitle appoptional arguments:
-h, --help show this help message and exit
-C CONCURRENCY, --concurrency CONCURRENCY
Number of concurrent API requests to make
-o OUTPUT, --output OUTPUT
Output path for subtitles (by default, subtitles are
saved in the same directory and name as the source
path)
-F FORMAT, --format FORMAT
Destination subtitle format
-S SRC_LANGUAGE, --src-language SRC_LANGUAGE
Language spoken in source file
-D DST_LANGUAGE, --dst-language DST_LANGUAGE
Desired language for the subtitles
-K API_KEY, --api-key API_KEY
The Google Translate API key to be used. (Required for
subtitle translation)
--list-formats List all available subtitle formats
--list-languages List all available source/destination languageside
使用方法很是簡單,將你的視頻或者音頻放入項目文件夾,輸入命令post
autosub -S zh-CN -D zh-CN 視頻/音頻路徑
這裏假設你視頻中的語言是國語,固然也能夠是其餘國別,這裏是支持語言代碼:測試
af Afrikaans
ar Arabic
az Azerbaijani
be Belarusian
bg Bulgarian
bn Bengali
bs Bosnian
ca Catalan
ceb Cebuano
cs Czech
cy Welsh
da Danish
de German
el Greek
en English
eo Esperanto
es Spanish
et Estonian
eu Basque
fa Persian
fi Finnish
fr French
ga Irish
gl Galician
gu Gujarati
ha Hausa
hi Hindi
hmn Hmong
hr Croatian
ht Haitian Creole
hu Hungarian
hy Armenian
id Indonesian
ig Igbo
is Icelandic
it Italian
iw Hebrew
ja Japanese
jw Javanese
ka Georgian
kk Kazakh
km Khmer
kn Kannada
ko Korean
la Latin
lo Lao
lt Lithuanian
lv Latvian
mg Malagasy
mi Maori
mk Macedonian
ml Malayalam
mn Mongolian
mr Marathi
ms Malay
mt Maltese
my Myanmar (Burmese)
ne Nepali
nl Dutch
no Norwegian
ny Chichewa
pa Punjabi
pl Polish
pt Portuguese
ro Romanian
ru Russian
si Sinhala
sk Slovak
sl Slovenian
so Somali
sq Albanian
sr Serbian
st Sesotho
su Sudanese
sv Swedish
sw Swahili
ta Tamil
te Telugu
tg Tajik
th Thai
tl Filipino
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
yi Yiddish
yo Yoruba
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
zu Zulu
也就是說,若是你下載了小語種國家的電影,可是不知道里面在講些什麼,也能夠依賴這個庫進行語音識別。
識別過程可能會有些慢,這取決於你的視頻/音頻的體積大小
若是想快一點,能夠爲autosub庫手動加上本身的代理服務,打開autosub源碼中的__init__.py文件,大概在99行左右使用requests庫請求接口時加上proxies。
try: resp = requests.post(url, data=data, headers=headers, proxies={ 'http': 'http://127.0.0.1:4780', 'https': 'https://127.0.0.1:4780' }) except requests.exceptions.ConnectionError: continue
識別結束後,就會將語音轉儲成爲可見的字幕文件:
0
00:00:00,150 --> 00:00:04,380
好比如今線上怎麼樣是能夠訪問的的1
00:00:04,381 --> 00:00:08,520
可是假設我幹嗎改了你怎麼辦2
00:00:08,521 --> 00:00:09,660
你還得從新打吧3
00:00:09,661 --> 00:00:15,930
其實並不須要對有點像咱們手機應用有些應用4
00:00:15,931 --> 00:00:17,160
它是更新版本的時候5
00:00:17,161 --> 00:00:18,660
你說要重複從新安裝6
00:00:20,010 --> 00:00:20,610
沒印象
固然了,有些句子或者詞彙並不許確,可能須要手工修改一下,爲了讓你的字幕更加精準,這樣的修改工做是避免不了的。
咱們獲得了識別字幕後,就能夠着手進行雙語字幕的製做了,首先註冊https://cloud.google.com/
這裏新用戶註冊成功後,都會贈送300美金,其實就是大概可使用一年,此時點擊控制檯。
在默認項目中,確保你啓用了谷歌翻譯服務
隨後,點擊憑據,生成一個新的API祕鑰,該祕鑰在調用接口時須要經過參數進行傳遞。
如今前置任務搞定了,咱們來寫個測試腳本
import requests import json content = "Several years ago,i went to study python in beijing" language_type = "en" url = "https://translation.googleapis.com/language/translate/v2" data = { 'key': 'API祕鑰', #你本身的api密鑰 'source': language_type, 'target': 'zh-cn', 'q': content, 'format': 'text' } headers = {'X-HTTP-Method-Override': 'GET'} response = requests.post(url, data=data, headers=headers) res = response.json() text = res["data"]["translations"][0]["translatedText"] print(text)
這裏咱們將英文翻譯成國語,能夠看到速度仍是蠻快的。
那若是針對字幕,則是針對國語翻譯爲英文,再經過文件追加的方式將英文寫入到字幕每一行的下方。
通過翻譯的字幕就是下面這樣:
0
00:00:00,150 --> 00:00:04,380
For example, what is accessible online now
好比如今線上怎麼樣是能夠訪問的的1
00:00:04,381 --> 00:00:08,520
But suppose I changed what about you
可是假設我幹嗎改了你怎麼辦2
00:00:08,521 --> 00:00:09,660
You'll have to try again
你還得從新打吧3
00:00:09,661 --> 00:00:15,930
It doesn't have to be a little bit like we have apps on our phones, some apps
其實並不須要對有點像咱們手機應用有些應用4
00:00:15,931 --> 00:00:17,160
It's time to update the version
它是更新版本的時候5
00:00:17,161 --> 00:00:18,660
You said you'd have to reinstall it
你說要重複從新安裝6
00:00:20,010 --> 00:00:20,610
No impression?
沒印象
看起來還不錯,可是如今雙語字幕和視頻仍是分離的狀態,咱們須要將它們進行合併,因而又到了ffmpeg閃亮登場的時刻了。
ffmpeg -i test.mp4 -i my.srt -c:s mov_text -c:v copy -c:a copy output.mp4
上面的命令就是將目標視頻和目標字幕合併爲一個新的視頻output.mp4
效果是這樣的:
是否是感受有點高大上,又或者,你想讓字幕也炫酷一點
ffmpeg -i test.mp4 -vf "subtitles=my.srt:force_style='Fontsize=24,PrimaryColour=&H0000ff&'" -c:a copy output.mp4
這裏使用force_style過濾器中的subtitles選項。使用字幕文件subs.srt並使用紅色字體顏色製做字體大小爲24的示例。
效果是這樣的:
關於字幕更多的設置方案請參照官方文檔:http://ffmpeg.org/ffmpeg-all....
結語:雙語字幕能夠輕鬆的讓影片的播放量獲得穩定的增加,同時也能夠吸引到其餘國別的觀衆,何樂而不爲,因而可知,技術改變生活的同時,也能夠改變咱們工做。
原文轉載自「劉悅的技術博客」 https://v3u.cn/a_id_169