Скрипт складальника цитат і розпізнання тексту з відео на 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.

Читайте також  Papers, please. Як нейромережа допомагає нам перевіряти клієнтів і ловити шахраїв

Скрипт на вході отримує адреса ролика на 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 »” “
«РЕП – ЦЕ ОСМИСЛЕННЯ РЕАЛЬНОСТІ»
Читайте також  Розробка гексапода своїми руками з нуля (частина 1)

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

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

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

Степан Лютий

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

You may also like...

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

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