Closed s0910187 closed 5 years ago
您好,不知您用的是哪個操作系統?會不會使用命令行?
我假設您用的是 Windows,先大約寫一下,細節如果不清楚您再問。
這個項目要用到最新的 Python 3.7 版本,所以先確認安裝的 Python 版本是 3.7。
其次用這個項目前要先安裝 Tesseract 引擎,可以在这个页面下載。您需要的很可能是頁面上第二個鏈接(64 bit)。
安裝完 Tesseract,把 Tesseract 的安裝路徑添加進您的 $PATH
里:
做完這一步后點擊確認。現在啟動 Windows 命令行,輸入 tesseract
命令,系統應該能夠識別出來:
這樣 Tesseract 安裝就完成了。
在計算機上新建一個文件夾,例如在桌面,名字叫 videocr。在裡面放上您的視頻文件,例如名字叫 video.avi
。
再在文件夾裡新建一個 Python 文件 get_sub.py
,內容是:
# get_sub.py
import videocr
if __name__ == '__main__':
videocr.save_subtitles_to_file('video.avi', lang='chi_sim+eng')
注意 lang
參數您根據字幕語言自己填。
在命令行里去往這個文件夾,建立一個 Python virtualenv。進入 virtualenv,輸入 pip3 install videocr
命令安裝本項目。等安裝完,輸入 python get_sub.py
命令,開始提取字幕。提取过程中,計算機 CPU 佔用率會升高到 100%。
等提取完成,文件夾里會生成新文件 subtitle.srt
,內容就是字幕。如果字幕準確率不夠高,可以修改 get_sub.py
,調整 save_subtitles_to_file
函數的 sim_threshold
和 conf_threshold
這兩個參數,然後再提取試試。
全部流程就是這樣,不知道是不是好理解?提取字幕耗時較久,建立您先使用一個較短的視頻段落作測試。
您好,謝謝您的回覆,我用的是mac系統python版本是3.7.2,不過已依你的提示安裝好mac用的Tesseract和videocr,目前正測試看看能不能運行,發現目前cpu佔用率的確是100%,只是跑了10分鐘左右,subtitle.srt還是0byte,後來出現Killed: 9,然後程序就停止運行了,不曉得我是哪個步驟做錯了呢?
不過,我沒做到您上頭說的「Tesseract 的安裝路徑添加進您的 $PATH 里」請問這個在mac中該怎麼設定呢?
照畫面看來,我的Tesseract應該是有安裝成功才對呀
可否請您幫我解惑一下呢?謝謝
下班回家後換了一台電腦測試,一樣是mac系統 測試結果發現,不曉得是不是影片時間過長(約1小時左右),程序一樣跑了大概十幾分鐘後,就沒反應了,這次沒跳出錯誤訊息,但是很明顯看出tesseract一開始有運作,但十幾分鐘後就不再運作了。
如果是在 Mac 上用 Homebrew 安裝的 Tesseract,安裝時會自動添加 $PATH,看起來您裝的沒問題。
為了防止寫入時數據衝突,videocr 目前的行為是先把整個視頻識別完,再一次性寫入字幕,所以沒整個跑完前字幕文件會一直是空的。我也要再試試有沒有更好的辦法。
我在我自己的雙核筆記本電腦上測試時,識別 20 秒的視頻要用時 3 分鐘。CPU 核數越多速度會越快,但一小時的視頻估計還是要好幾個小時識別完。
您能不能試試看,先在視頻里抽個十秒鐘出來,看能不能識別出內容。
videocr.save_subtitles_to_file(
'video.avi', lang='chi_sim+eng', time_start='0:0:30', time_end='0:0:40')
例如用這個格式,可以只識別視頻第 30 秒到第 40 秒之間的內容。
我剛剛用了2分鐘的影片,就可以順利識別出字幕了,只是辨識度不夠高,大概20行裡面只識別出3行,所以之前跑不出來,應該是影片太長的問題… 只是若是要辨別一整部韓劇的字幕的話,還是需要讓程式能夠辨別1小時以上的影片才行 這個可能要請大大再試試看該如何調整程式了。 整體來說,若能夠實現用這個程式自動取出一整部韓劇的硬字幕的話,那對很多使用者來說,將會是一件非常方便的一件事了。
能工作就太好了。真是慚愧,我自己寫的時候就沒測試過那麼長的影片,有可能是運行久后內存用盡了。我這週有時間改進一下。
如果不要求輸出精確時間軸,識別速度可以比現在快很多。目前我為了識別出精確時間軸,採取的策略是對每一幀畫面都進行 OCR,所以 60 FPS 的視頻每一秒長度都要進行 60 次識別,非常慢。如果放寬一點精度要求,隔幀識別一次,速度就快一倍。您的需求是時間軸盡量越準越好嗎?
是的,若要完整製作出一部韓劇的字幕的話,時間軸需要非常精準才行 另外,我測試幾個檔案後發現,它不支援mkv檔的識別,一樣的影片轉成mp4檔就可以了 提供給您做改進時的參考。 非常感謝您開發出這麼好用的程式,希望到時真的能完美成為韓劇自動ocr的程式 以下是mkv檔跑完後出現的訊息
我的Mac是八代i7,6核心的,所以跑起來的話,應該20秒影片只需要40秒左右就能跑完。
對,這個截圖看起來是視頻格式問題,一般在 Mac 上轉成 mp4 最穩妥。
20 行裡面只識別出 3 行可能是默認 sim_threshold
太低了。默認值是 90,您可以試試:
videocr.save_subtitles_to_file( 'video.avi', lang='chi_sim+eng', sim_threshold=98)
把這個參數調到 98,可能效果會好一些。
另外如果識別韓文,您可以用 lang='kor'
和 lang='Hangul'
這兩個語言碼分別試一試。
我要識別的是簡體中文,因為很多韓劇的字幕都是簡體內嵌的,我想把它識別出來變成srt檔後,再轉成繁體的。
簡體中文的話,lang='chi_sim'
和 lang='HanS'
都可以試一下,有時候有奇效。總體上 Tesseract 對中文的識別準度是低一些,可能因為字符總數太龐大了……
的確,中文識別準度還真的蠻低的,不知道有沒有什麼更好的解決方法? 剛剛試了1分鐘左右的韓劇,結果有點兒慘,大概準度只有60%左右,而且,為什麼中間都會有空格?而且有蠻多行是重覆的,在劇情中,它應該就是同一句話而已。
改成HanS效果就好些了
行數重複多就是 sim_threshold
值太高了。
videocr 的工作原理是,對每一幀畫面都進行識別,然後再比較相鄰畫面識別出的文字。如果文字相似度高,就認定這兩幅畫面里是同一句話,進行合併;如果相似度低就判定為兩句不同的話。sim_threshold
值就是判定相似度的基準,相似度低於這個值就拆分成兩句話。
默認 sim_threshold
是 90,如果重複的行數很多就調低點,讓合併更激進;如果合併太嚴重了,就調高點。可能我說的 98 太高了。
Tesseract 是按詞識別的,每個詞之間會加空格,這個主要是對英語之類語言有意義。如果只識別中文,你可以轉換成繁體時把所有空格去掉。
我更新了一下代碼,現在提取兩小時長的影片在我機器上沒有問題(雖然花了一整天)。
您有空的時候幫我試試吧,用 $ pip3 install --upgrade videocr
更新軟件版本,然後提取長影片看看效果。
覺得您很厲害,很想測試看看 只是我是python初學者,沒有使用教學不知該如何著手 可以麻煩您簡單寫個教學嗎? 謝謝