Скрипт сборщика цитат и распознания текста из видео на 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.
Скрипт на входе получает адрес ролика на youtube. Скачивает файл, начинает обрабатывать по одному кадру в 5 секунд. Если в кадре есть квадрат, вырезаем его, обесцвечивает, повышаем контрастность и распознаем. Если строка меньше 15 символов, не учитываем ее. Можете, конечно, использовать и строку меньше 15 символов, но как сказала одна из героинь передачи:
-Я не знаю, пацаны, как Вы живете с маленькими строками.
Заносим в лог файл текст, время и ссылку на момент на youtube. Пропускаем 5 секунд (не спрашивайте почему именно эта цифра первой пришла в голову, проверив не нашел наложения двух цитат в пределах этого времени). Можно удалить файл видео и приступить к следующему выпуску.
Полный код скрипта:
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+"
")
f.write('Время Цитата Ссылка ')
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(''+str(thissec)+' '+text+' Ссылка ')
print("----")
f.write('
')
f.close()
Время, 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 для моего проекта робота по сбору мячей для гольфа.