Сколько у Вас см? Что Вы скажете Путину? Слушаете ли Вы 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+"<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()
Время, 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 для моего проекта робота по сбору мячей для гольфа.
Комментарии (20)
Andronas
04.11.2018 12:56-1проект «Вдудь» не нуждается в представлении
но видимо не всем, есть еще маргиналыaapazhe
04.11.2018 14:33+4Не видел ни одного выпуска. И не собираюсь смотреть впредь.
Лучше быть маргиналом, чем жрать дерьмо с транспортёра только потому, что «его едят все».webzuweb Автор
04.11.2018 15:26Причем здесь это?
Вы можете смотреть что душе угодно.
Скрипт о получении текста из видео.
lumaxy
04.11.2018 18:09Смотреть или не смотреть — лично дело каждого, а вот считать дерьмом заранее что-то только потому, что это «едят все» — не совсем разумная позиция. «Вдудь», конечно, далеко не «Очевидное-невероятное», но персонажи там бывают крайне интересные, иногда это непосредственные участники знаковых событий в новейшей истории.
Andronas
04.11.2018 17:04Таки это была ирония сам этого проекта не видел до сегодняшнего дня. Но отчаянные минусаторы лепят минусы налево и направо из серии «не читал не смотрел но осуждаю» ;)
GoldJee
04.11.2018 19:29начинает обрабатывать по одному кадру в 5 секунд
Почему такая низкая производительность? Это из-за железа (Raspberry), языка (Python) или тяжелых алгоритмов распознавания? Можно ли как-то ускорить?
lari4
06.11.2018 11:27Еще бы код был на нормальном питоне. Такое название переменных
spisoksimvolovpodudalenie
очень больно видетьwebzuweb Автор
06.11.2018 13:23Какое название для данной переменной Вас бы устроило и Вы поняли зачем она без контекста?
lari4
06.11.2018 15:44- Никогда не пишите названия переменных по-русски латиницей (spisoksimvolovpodudalenie, udaleniesimvolov, stroka, etc.), этот же смысл можно же и на английском передать (chars_for_replace, replace_chars, line). И еще про spisoksimvolovpodudalenie, если у Вас объект типа list, не надо в названии указывать то, что это список.
- Лишняя переменная title, у Вас объект уже храниться в a.title .
- Для работы с файлами используйте менеджер контекста.
- У Вас везде используется конкатенация строк, вместо этого используйте либо .format, либо f-string(>= python 3.6).
- Переменная nameofvideo — название не соответствует содержанию и написание не по PEP8, video_id, как вариант.
HeaTTheatR
06.11.2018 11:47Код, конечно, ужасный! За такой код нужно отрезать пальцы вместе с руками!
webzuweb Автор
06.11.2018 13:23До таких экзекуций я опускаться не буду.
От Вас в качестве мастер-класса, можно получить разбор основных ошибок?
saipr
Просто и элегантно. И самое главное полезно.
webzuweb Автор
Спасибо! Я думаю, в целом такой скрипт может быть полезен для распознания вшитых субтитров. Я надеюсь, кому-то он поможет. Я узнаю много нового для себя в процессе написания таких скриптов для удовольствия.
mamba_shmel
По-моему это #заебись