apm1467 / videocr

Extract hardcoded subtitles from videos using machine learning
MIT License
506 stars 117 forks source link

請問該如何使用 #2

Closed s0910187 closed 5 years ago

s0910187 commented 5 years ago

覺得您很厲害,很想測試看看 只是我是python初學者,沒有使用教學不知該如何著手 可以麻煩您簡單寫個教學嗎? 謝謝

apm1467 commented 5 years ago

您好,不知您用的是哪個操作系統?會不會使用命令行?

我假設您用的是 Windows,先大約寫一下,細節如果不清楚您再問。

  1. 這個項目要用到最新的 Python 3.7 版本,所以先確認安裝的 Python 版本是 3.7。

  2. 其次用這個項目前要先安裝 Tesseract 引擎,可以在这个页面下載。您需要的很可能是頁面上第二個鏈接(64 bit)。

    安裝完 Tesseract,把 Tesseract 的安裝路徑添加進您的 $PATH 里:

    Screenshot 2019-05-14 at 06 06 22 Screenshot 2019-05-14 at 06 08 20 Screenshot 2019-05-14 at 06 10 14

    做完這一步后點擊確認。現在啟動 Windows 命令行,輸入 tesseract 命令,系統應該能夠識別出來:

    Screenshot 2019-05-14 at 06 14 01

    這樣 Tesseract 安裝就完成了。

  3. 在計算機上新建一個文件夾,例如在桌面,名字叫 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 參數您根據字幕語言自己填。

  4. 在命令行里去往這個文件夾,建立一個 Python virtualenv。進入 virtualenv,輸入 pip3 install videocr 命令安裝本項目。等安裝完,輸入 python get_sub.py 命令,開始提取字幕。提取过程中,計算機 CPU 佔用率會升高到 100%。

  5. 等提取完成,文件夾里會生成新文件 subtitle.srt,內容就是字幕。如果字幕準確率不夠高,可以修改 get_sub.py,調整 save_subtitles_to_file 函數的 sim_thresholdconf_threshold 這兩個參數,然後再提取試試。

全部流程就是這樣,不知道是不是好理解?提取字幕耗時較久,建立您先使用一個較短的視頻段落作測試。

s0910187 commented 5 years ago

您好,謝謝您的回覆,我用的是mac系統python版本是3.7.2,不過已依你的提示安裝好mac用的Tesseract和videocr,目前正測試看看能不能運行,發現目前cpu佔用率的確是100%,只是跑了10分鐘左右,subtitle.srt還是0byte,後來出現Killed: 9,然後程序就停止運行了,不曉得我是哪個步驟做錯了呢? 不過,我沒做到您上頭說的「Tesseract 的安裝路徑添加進您的 $PATH 里」請問這個在mac中該怎麼設定呢? 照畫面看來,我的Tesseract應該是有安裝成功才對呀 可否請您幫我解惑一下呢?謝謝 螢幕快照 2019-05-14 下午3 21 59

s0910187 commented 5 years ago

下班回家後換了一台電腦測試,一樣是mac系統 測試結果發現,不曉得是不是影片時間過長(約1小時左右),程序一樣跑了大概十幾分鐘後,就沒反應了,這次沒跳出錯誤訊息,但是很明顯看出tesseract一開始有運作,但十幾分鐘後就不再運作了。

apm1467 commented 5 years ago

如果是在 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 秒之間的內容。

s0910187 commented 5 years ago

我剛剛用了2分鐘的影片,就可以順利識別出字幕了,只是辨識度不夠高,大概20行裡面只識別出3行,所以之前跑不出來,應該是影片太長的問題… 只是若是要辨別一整部韓劇的字幕的話,還是需要讓程式能夠辨別1小時以上的影片才行 這個可能要請大大再試試看該如何調整程式了。 整體來說,若能夠實現用這個程式自動取出一整部韓劇的硬字幕的話,那對很多使用者來說,將會是一件非常方便的一件事了。

apm1467 commented 5 years ago

能工作就太好了。真是慚愧,我自己寫的時候就沒測試過那麼長的影片,有可能是運行久后內存用盡了。我這週有時間改進一下。

如果不要求輸出精確時間軸,識別速度可以比現在快很多。目前我為了識別出精確時間軸,採取的策略是對每一幀畫面都進行 OCR,所以 60 FPS 的視頻每一秒長度都要進行 60 次識別,非常慢。如果放寬一點精度要求,隔幀識別一次,速度就快一倍。您的需求是時間軸盡量越準越好嗎?

s0910187 commented 5 years ago

是的,若要完整製作出一部韓劇的字幕的話,時間軸需要非常精準才行 另外,我測試幾個檔案後發現,它不支援mkv檔的識別,一樣的影片轉成mp4檔就可以了 提供給您做改進時的參考。 非常感謝您開發出這麼好用的程式,希望到時真的能完美成為韓劇自動ocr的程式 以下是mkv檔跑完後出現的訊息

螢幕快照 2019-05-14 下午11 30 16
s0910187 commented 5 years ago

我的Mac是八代i7,6核心的,所以跑起來的話,應該20秒影片只需要40秒左右就能跑完。

apm1467 commented 5 years ago

對,這個截圖看起來是視頻格式問題,一般在 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' 這兩個語言碼分別試一試。

s0910187 commented 5 years ago

我要識別的是簡體中文,因為很多韓劇的字幕都是簡體內嵌的,我想把它識別出來變成srt檔後,再轉成繁體的。

apm1467 commented 5 years ago

簡體中文的話,lang='chi_sim'lang='HanS' 都可以試一下,有時候有奇效。總體上 Tesseract 對中文的識別準度是低一些,可能因為字符總數太龐大了……

s0910187 commented 5 years ago

的確,中文識別準度還真的蠻低的,不知道有沒有什麼更好的解決方法? 剛剛試了1分鐘左右的韓劇,結果有點兒慘,大概準度只有60%左右,而且,為什麼中間都會有空格?而且有蠻多行是重覆的,在劇情中,它應該就是同一句話而已。

螢幕快照 2019-05-14 下午11 50 10
s0910187 commented 5 years ago

改成HanS效果就好些了

螢幕快照 2019-05-14 下午11 57 45
apm1467 commented 5 years ago

行數重複多就是 sim_threshold 值太高了。

videocr 的工作原理是,對每一幀畫面都進行識別,然後再比較相鄰畫面識別出的文字。如果文字相似度高,就認定這兩幅畫面里是同一句話,進行合併;如果相似度低就判定為兩句不同的話。sim_threshold 值就是判定相似度的基準,相似度低於這個值就拆分成兩句話。

默認 sim_threshold 是 90,如果重複的行數很多就調低點,讓合併更激進;如果合併太嚴重了,就調高點。可能我說的 98 太高了。

Tesseract 是按詞識別的,每個詞之間會加空格,這個主要是對英語之類語言有意義。如果只識別中文,你可以轉換成繁體時把所有空格去掉。

apm1467 commented 5 years ago

我更新了一下代碼,現在提取兩小時長的影片在我機器上沒有問題(雖然花了一整天)。

您有空的時候幫我試試吧,用 $ pip3 install --upgrade videocr 更新軟件版本,然後提取長影片看看效果。