Скрипт складальника цитат і розпізнання тексту з відео на Python

Пост про скрипт, який завантажує відео з youtube і розпізнає в ньому текст. Почати вирішив з практичної реалізації. «Vdudictionary» — Скрипт складальника збірника цитат героїв «Вдудь» на Python. Юрій Дудь і його проект «Вдудь» не потребує представлення. Найгарячіші інтерв’ю, які цікаво дивитися. Юрій Олександрович вміє зробити цікаве шоу, незалежно від того, чи знаєте Ви героя конкретного випуску, є його фанатом або вперше чуєте це ім’я.

Скільки у Вас см? Що Ви скажете Путіну? Чи слухаєте Ви OXY?

Ці і багато інші питання тепер асоціюються з Дудем. Коли інтерв’юється вимовляє фразу сповнений мудрістю, турботливі монтажери акуратно виводять її на екран наших з Вами моніторів, щоб донести до нас всю суть. Моєю метою було закристалізувати цю мудрість поколінь і створити словник «Вдудексикон» або «Vdudictionary».
Природно людині, нехай і не обтяженого специфічним IT бэкграудом, не слід руками збирати ці вислови. Для цього я накидав скрипт на python.

Насамперед нам потрібен файл, який будемо обробляти. Для скачування відео з Youtube я використовував модуль pytube.

pip install pytube

Приклад скачування файлу з youtube

from pytube import YouTube
a=YouTube('https://www.youtube.com/watch?v=RNbXm8WKmow')
a.streams.first().завантажити()

Файл завантажили. Тепер почнемо методично визначати кадри з концентрованим змістом, з мудрістю сучасників, з висловами героїв нашого часу.

В старих версіях не було прямокутної плашки, тому ми можемо шукати текст в нижній частині екрана. В нових випусках можна для пошуку прямокутника можна використовувати той же старий добрий OpenCV, який дозволить отримати кадр з відео.

a,contours,h = cv2.findContours(gray3, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for i in contours:
cv2.drawContours(gray3,[i],0,(0,0,255),1)

Для установки cv2 для python3 на raspberry3 довелося встановити багато пакетів з-за залежностей. Можливо, деякі пакети надлишкові, це через мою недосвідченість, саме так все завелося.


sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get -y install libopencv-dev
sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm
sudo apt-get -y install libtiff4-dev libjpeg-dev libjasper-dev
sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev
sudo apt-get -y install python-dev python-numpy
sudo apt-get -y install libtbb-dev
sudo apt-get -y install libqt4-dev libgtk2.0-dev
sudo apt-get -y install libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev
pip install opencv-python

Ставимо tesseract — це OCR движок, необхідний для оптичного розпізнавання тексту.


sudo apt-get install tesseract-ocr
sudo pip3 install pytesseract
sudo pip3 install tesseract

У випусках використовується досить специфічна гарнітура, це утрудняє розпізнавання. Взагалі ж для кирилиці встановлюємо словник. Завантажуємо і переносимо в /usr/share/tesseract-ocr/tessdata.

Скрипт на вході отримує адреса ролика на youtube. Завантажує файл, починає обробляти по одному кадру в 5 секунд. Якщо в кадрі є квадрат, вирізаємо його, знебарвлює, підвищуємо контрастність і розпізнаємо. Якщо рядок менше 15 символів, не враховуємо її. Можете, звичайно, використовувати і рядок менше 15 символів, але як сказала одна з героїнь передачі:
-Я не знаю, пацани, як Ви живете з маленькими рядками.

Заносимо в лог файл текст, час і посилання на момент на youtube. Пропускаємо 5 секунд( не питайте чому саме ця цифра першою прийшла у голову, перевіривши не знайшов накладення двох цитат в межах цього часу). Можна видалити відео файл і приступити до наступного випуску.

Повний код скрипта:

Скрипт на Python 3

import cv2
import pytesseract
import numpy as np
from pytube import YouTube
import os

nameofvideo="RNbXm8WKmow"

a=YouTube('https://www.youtube.com/watch?v='+nameofvideo)
a.streams.first().завантажити()
title=a.title
title2=title.replace("/","").replace(",","").replace(".","")+".mp4
os.rename(title2, "youtubefile.mp4)
print(title)
f=open('/var/www/python/'+str(nameofvideo)+'.txt','w')
f.write(title+"<br>")
f.write('<table><tr><td></td><td>Цитата</td><td>Посилання</td></tr>')

spisoksimvolovpodudalenie=["*","/","|","\",")","(","}","{","+","`","~","№","",":","$","#","@","%","[","]","&","^","' "]
def udaleniesimvolov(stroka):
 for element in spisoksimvolovpodudalenie:
stroka=stroka.replace(element,"")
 return stroka

vidcap = cv2.VideoCapture('youtubefile.mp4')
vidcap.set(cv2.CAP_PROP_POS_AVI_RATIO,1)
durationsec=int(vidcap.get(cv2.CAP_PROP_POS_MSEC)/1000)
print("duration: "+str(durationsec)+" sec")

for thissec in range(0,durationsec,5):
vidcap.set(cv2.CAP_PROP_POS_MSEC,thissec*1000)
 success,image = vidcap.read()
 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 gray2 = cv2.addWeighted( gray, 1.5, gray, 0, 0.5)
 gray3 = gray2[450:670,0:1280]
 if success:
 print(str(thissec)+" сек.")
 text = udaleniesimvolov(pytesseract.image_to_string(gray3, lang='ua'))
 if len(text)>15:
 print (text)
 f.write('<tr><td>'+str(thissec)+'</td><td>'+text+'</td><td><a href="https://www.youtube.com/watch?v='+nameofvideo+"&t="+str(thissec)+'">Посилання</a></td></tr>')
print("----")
f.write('</table>')
f.close()

Приклад роботи скриптаТолоконникова — бісексуальність, FACE, в’язниця / вДудь

Час, c. Цитата  
95 «АКТИВІСТИ НЕ ПОВИННІ НЕНАВИДІТИ МЕНТОБ.
ВОНИ ПОВИННІ ПОПЫТДТЬСЯ ПОННТЬ,
ЩО МЕНТА СПОНУКАЛО БУТИ МЕНТОМ»
195 ПЕТРО ВЕРЗІЛОВ — УЧАСНИЦЯ PUSSY RIOT
БЫВШИИ ЧОЛОВІК НАДІЇ ТОЛОКОННИКОВОИ
255 Катерина Самуцевич
570 ОБОЖНЮЮ ТРИКОТАЖ!
595 ‘вляДЬМЦР сорбйПн
990 ПЕТРО ВЕРЗІЛОВ В ЮНОСТІ ЖИВ У ЯПОНІЇ РАЗОМ З БАТЬКАМИ.
БАТЬКО ПЕТРА — ФІЗИК-ЯДЕРНИК
995 ПЕТРО ВЕРЗІЛОВ В ЮНОСТІ ЖИВ У ЯПОНІЇ РАЗОМ З БАТЬКАМИ.
БАТЬКО ПЕТРА — ФІЗИК-ЯДЕРНИК
1270 11 ВЕРЕСНЯ 2018 РОКУ ПЕТРО внрзипов БУВ госпитдлизировдн
у токсикоувднимдционуов ВІДДІЛЕННЯ
міському клінічному Лікарні імені вдхрушиных
1275 15 ВЕРЕСНЯ БУВ ДОСТАВЛЕНИЙ ПРИВАТНИМ ЛІТАКОМ
В БЕРЛІНСЬКУ КЛІНІКУ СНАШТЕ
1280 18 ВЕРЕСНЯ 2018 РОКУ БЕРЛІНСЬКІ ВРАЧИЗАЯВИПИ
ШВИДШЕ ЗА ВСЕ, ВЕРЗИЛОВ БУВ ОТРУЄНИЙ СКОПОЛАМІНОМ.
26 ВЕРЕСНЯ БУВ ВИПИСАНИЙ З КЛІНІКИ БЕРЛИНСКОИ
1285 18 ВЕРЕСНЯ 2018 РОКУ БЕРЛІНСЬКІ ЛІКАРІ ЗАЯВИЛИ
ШВИДШЕ ЗА ВСЕ, ВЕРЗИЛОВ БУВ ОТРУЄНИЙ СКОПОЛАМІНОМ.
26 ВЕРЕСНЯ БУВ ВИПИСАНИЙ З КЛІНІКИ БЕРЛИНСКОИ
1395 «МЕДИАЗОНА» — интврнвт-издднив про суди,
АРЕШТИ і рорсию. основднноЕ в свнтявув 2014 року
НАДЕЖДОИ тол_оконниковои і МАРИЕИ Алехинои
1590 «Якщо щось СТРАШНЕ прейсХЬдиі зі? нЕзндчит, ‘
що ти МАЄШ від СЕБЕ откдздтьря»
1760 йоко оно — ГРОМАДСЬКИЙ ДІЯЧ, ВДОВА ДЖО ” …
ПЕ
ВІЦА, ХУДОЖНИК,
2040 «ЯКЩО У КОГО-ТО БОЖЕВІЛЬНІ БАТЬКИ,
ЦЕ, ШВИДШЕ, ПРИВІД ДЛЯ РЕСПЕКТ!-»
2330 «ВНРЕННЯЯ МАМА»
2425 ГРАД КІТЕЖ — ЗАТОНУЛЕ МІСТО,_НАХ0ДИВШИЙСЯ’ ЗА ПЕРЕКАЗАМИ,
У ОЕВЕРНОИ ЧАСТИНИ НИЖЕГОРОДСКОИ ОБЛАСТІ,
НА БЕРЕГАХ ОЗЕРА СВЕТЛОЯР
2515 «ми ЖЕМ ЛОБСЕРА і пОмогд
здключиным і ПИСЬМЕННИКАМ»
2550 ЗАРАЗ – В ЖОРСТКІЙ ОПОЗИЦІЇ РООСИЙ “. ‘
ЖИВЕ І ПРАЦЮЄ В США
2745 ТОЛОКОННИКОВА ПРОБУЛА У В’ЯЗНИЦІ 661 ДЕНЬ.
. З 3 БЕРЕЗНЯ 2012 РОКУ ПО 23 ГРУДНЯ 2013 РОКУ
У мд.
2985 ВПТСН — ТЕРМІН, ЩО ПОЗНАЧАЄ НА СЛЕНГУ
ЛГБТ-СПІЛЬНОТИ МУЖЕПОДОБНУЮ ДІВЧИНУ ‘ ‘
00 СТРИЖКОИ «ПІД МАЛЬЕИ_К_А»
2990 ВЦТСН — ТЕРМІН, ЩО ПОЗНАЧАЄ НА СЛЕНГУ _
ЛГБТ-СПІЛЬНОТИ МУЖЕПОДОБНУЮ ДІВЧИНУ
З СТРИЖКОИ «ПІД ХЛОПЧИКА»
3280 «ТАКА РОСІЙСЬКА РАЗИ «НУ ТИ
; б?
3290 ШІЗО — ШТРАФНИЙ ІЗОЛЯТОР. ВІДДІЛЕННЯ ВИПРАВНОЇ УСТАНОВИ,
ДЕ РАОПОЛОЖЕНЫ КАМЕРИ ДЛЯ НАРХШИТЕЛЕИ РЕЖИМУ УТРИМАННЯ.
ЛЮДИНА, ПОМЕЩЕННЫИ В ШТРАФНОИ ІЗОЛЯТОР,
ІСТОТНО ОБМЕЖЕНИЙ У ПРАВАХ
‘ь “, — “
3315 «ЛЮДИНА, котбрый довго сидить, «Е;
ПЕРЕПРИДУМЬЩАЕТ своє життя здново»; 3
3510 ПІСЛЯ АКЦІЇ В ХРАМІ ХРИСТА –“ПАСИТЕЛЯ БУЛИ ЗАТРИМАНІ І
ЗАСУДЖЕНІ ТРИ УЧАСНИЦІ РПЗЗУ КЮТ
НАДІЯ ТОЛОКОННИКОВА, МАРІЯ АЛЬОХІНА ТА КАТЕРИНА САМУЦЕВІЧ
3540 КАТЕРИНА САМУЦ
ОТРИМАЛА ДВА РОКИ УМОВНО
3660 «МОЛОДЬ дико тРАвмируЕ. __
що пдв НЕМАЄ сЕксудльного оврдзовдния”; ‘
3740 НАДІЯ ТОЛОКОННИКОВА ДВІЧІ ОГОЛОШУВАЛА ГОЛОДУВАННЯ
У МОРДОВОКОЙ КОЛОНІЇ Н° 14 ПРО ВИМОГОЮ ПЕРЕКЛАДУ
В ІНШЕ МІСЦЕ ВІДБУВАННЯ ПОКАРАННЯ
4275 МОВА ПРО АКЦІЙ РПЗЗУ РЮТ СМИЛИЦИОНЕР ВСТУПАЄ В ГРУ» _
У ФІНАЛІ ЧС-2018 В МОСКВІ
4495

«ПОЄДНАННЯ ДИЧИНИ І ПОЗИЦІЇ»
4735 «ЯКЩО У МЕНЕ БУДЕ ПОГАНА РИМА І ХОРОША,
Я ВИБЕРУ ПОГАНУ»
4755 «ЗООПАРКОВАЯ ІСТОРІЯ»
4800 БЕРНІ САНДЕРС — КАНДИДАТ В ПРЕЗИДЕ_НТЫ США
НА ВИБОРАХ 2016_ОДА. ПРОГРАВ ПРАИМЕРИЗ
ДЕМОКРАТИЧЕСКОИ ПАРТІЇ ХИППАРИ КЛІНТОН
4820 . ЗАДРЦ З У
НАСТОЙ’ЕИВОСТЬ
_умвдив говорити нд РАзнБіх языкдх
4865 «здльный торчок»
5055 »” “
«РЕП – ЦЕ ОСМИСЛЕННЯ РЕАЛЬНОСТІ»

У скрипта явно є якісь проблеми з распознанием «специфічного» ВДУДЬ-шрифту. Я бачу вирішення даної проблеми в доопрацюванні файлу словника для OCR і в постобробці тексту через PyEnchant.

При невеликому доопрацюванні даний сценарій можна використовувати для пошуку вшитих субтитрів, їх розпізнання та автоматичного перекладу на іншу мову.

Спасибі за увагу!

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *