Скрипт сборщика цитат и распознания текста из видео на 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().download()
Файл скачали. Теперь начнем методично определять кадры с концентрированным смыслом, с мудростью современников, с изречениями героев нашего времени.
В новых выпусках можно для поиска прямоугольника можно использовать тот же старый добрый 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.
Скачивает файл, начинает обрабатывать по одному кадру в 5 секунд. Скрипт на входе получает адрес ролика на youtube. Если строка меньше 15 символов, не учитываем ее. Если в кадре есть квадрат, вырезаем его, обесцвечивает, повышаем контрастность и распознаем. Можете, конечно, использовать и строку меньше 15 символов, но как сказала одна из героинь передачи:
-Я не знаю, пацаны, как Вы живете с маленькими строками.
Пропускаем 5 секунд( не спрашивайте почему именно эта цифра первой пришла в голову, проверив не нашел наложения двух цитат в пределах этого времени). Заносим в лог файл текст, время и ссылку на момент на youtube. Можно удалить файл видео и приступить к следующему выпуску.
Полный код скрипта:
Скрипт на 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().download()
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)+" sec.") text = udaleniesimvolov(pytesseract.image_to_string(gray3, lang='rus')) 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.
При небольшой доработке данный скрипт можно использовать для поиска вшитых субтитров, их распознания и автоматического перевода на другой язык.
#habr #vdudictionary ВК, FB. Если Вы можете поспособствовать тому, чтобы Юрий узнал об этом эксперименте, просьба сделать это не откладывая.
Спасибо за внимание! Скрипт и пост получились в результате полета фантазии при изучении OpenCV для моего проекта робота по сбору мячей для гольфа.