Worüber YouTube spricht

Bild

Zu Beginn des maschinellen Lernens sahen die meisten Lösungen sehr seltsam, isoliert und ungewöhnlich aus. Viele ML-Algorithmen sind bereits heute in einem für Programmierer vertrauten Satz von Frameworks und Toolkits enthalten, mit denen Sie arbeiten können, ohne auf die Details ihrer Implementierung einzugehen.
Übrigens bin ich gegen einen so oberflächlichen Ansatz, aber ich möchte meinen Kollegen zeigen, dass sich diese Branche sprunghaft bewegt und es nicht kompliziert ist, ihre Erfolge in Produktionsprojekten anzuwenden.

Als Beispiel werde ich zeigen, wie Sie dem Benutzer helfen können, das richtige Videomaterial unter Hunderten von anderen in unserem Workflow-Service zu finden.

In meinem Projekt erstellen und teilen Benutzer Hunderte verschiedener Materialien: Text, Bilder, Videos, Artikel, Dokumente in verschiedenen Formaten.

Die Suche nach Dokumenten scheint einfach zu sein. Aber was tun mit der Suche nach Multimedia-Inhalten? Für einen vollwertigen Benutzerdienst müssen Sie sich verpflichten, eine Beschreibung auszufüllen, dem Video oder Bild einen Namen zu geben, da mehrere Tags nicht schaden. Leider möchte nicht jeder Zeit mit solchen Inhaltsverbesserungen verbringen. Normalerweise lädt der Nutzer einen Link zu YouTube hoch, meldet, dass es sich um ein neues Video handelt, und klickt auf Speichern. Was kann ein Dienst mit solchen „grauen“ Inhalten tun? Die erste Idee ist, YouTube zu fragen? YouTube ist aber auch mit Nutzern gefüllt (oft derselbe Nutzer). Oft stammt das Videomaterial nicht vom Youtube-Dienst.
So kam mir die Idee, unserem Service beizubringen, das Video anzuhören und zu verstehen, worum es geht.

Ich gebe zu, diese Idee ist nicht neu, aber heute ist es für ihre Umsetzung nicht erforderlich, zehn Data Scientists, nur zwei Tage und ein wenig Hardwareressourcen zu beschäftigen.

Erklärung des Problems


Unser Microservice, nennen wir es Summarizer , sollte:

  • Video vom Mediendienst herunterladen;
  • Audiospur extrahieren;
  • Hören Sie sich die Audiospur an, tatsächlich Sprache zu Text;
  • Finde 20 Schlüsselwörter;
  • Wählen Sie einen Satz aus dem Text aus, um die Essenz des Videos zu maximieren.
  • Senden Sie alle Ergebnisse an den Inhaltsdienst.

Wir werden der Implementierung von Python vertrauen, sodass Sie sich nicht mit der Integration in vorgefertigte ML-Lösungen befassen müssen.

Schritt eins: Audio zu Text.

Installieren Sie zunächst alle erforderlichen Komponenten.

pip3 install wave numpy tensorflow youtube_dl ffmpeg-python deepspeech nltk networkx brew install ffmpeg wget 

Laden Sie anschließend das trainierte Modell für die Speech-to-Text-Lösung von Mozilla - Deepspeech herunter und entpacken Sie es.

 mkdir /Users/Volodymyr/Projects/deepspeech/ cd /Users/Volodymyr/Projects/deepspeech/ wget https://github.com/mozilla/DeepSpeech/releases/download/v0.3.0/deepspeech-0.3.0-models.tar.gz tar zxvf deepspeech-0.3.0-models.tar.gz 

Das Mozilla-Team hat eine ziemlich gute Lösung entwickelt und trainiert, mit der mit TensorFlow lange Audioclips in große Textblöcke mit hoher Qualität umgewandelt werden können. Mit TensorFlow können Sie auch sofort an der CPU und der GPU arbeiten.

Unser Code beginnt mit dem Herunterladen von Inhalten. Die wunderbare youtube-dl- Bibliothek, die über einen eingebauten Postprozessor verfügt, der Videos in das erforderliche Format konvertieren kann, wird ihm dabei helfen. Leider ist der Postprozessor-Code etwas eingeschränkt, er kann nicht neu abgetastet werden, daher werden wir ihm helfen.
Für den Deepspeech-Eingang müssen Sie eine Audiodatei mit einer Monospur und einem 16K-Sample senden. Dazu müssen wir unsere empfangene Datei erneut verarbeiten.

 _ = ffmpeg.input(youtube_id + '.wav').output(output_file_name, ac=1, t=crop_time, ar='16k').overwrite_output().run(capture_stdout=False) 

In derselben Operation können wir auch die Dauer unserer Datei begrenzen, indem wir einen zusätzlichen Parameter "t" übergeben.

Laden Sie das Deepspeech-Modell herunter.

 deepspeech = Model(args.model, N_FEATURES, N_CONTEXT, args.alphabet, BEAM_WIDTH) 

Mit der Wave-Bibliothek extrahieren wir Frames im np.array-Format und übertragen sie an die Eingabe der Deepspeech-Bibliothek.

 fin = wave.open(file_name, 'rb') framerate_sample = fin.getframerate() if framerate_sample != 16000: print('Warning: original sample rate ({}) is different than 16kHz. Resampling might produce erratic speech recognition.'.format(framerate_sample), file=sys.stderr) fin.close() return else: audio = np.frombuffer(fin.readframes(fin.getnframes()), np.int16) audio_length = fin.getnframes() * (1/16000) fin.close() print('Running inference.', file=sys.stderr) inference_start = timer() result = deepspeech.stt(audio, framerate_sample) 

Nach einer Weile erhalten Sie proportional zu Ihren Hardwareressourcen Text.

Schritt zwei: Finden der "Bedeutung"


Um nach Wörtern zu suchen, die den resultierenden Text beschreiben, verwende ich die Diagrammmethode. Diese Methode basiert auf dem Abstand zwischen Sequenzen. Zuerst finden wir alle „einzigartigen“ Wörter. Stellen Sie sich vor, dies sind die Eckpunkte unseres Diagramms. Nachdem wir den Text mit einem „Fenster“ einer bestimmten Länge durchgesehen haben, finden wir den Abstand zwischen den Wörtern. Sie sind die Ränder unserer Gaffel. Die dem Diagramm hinzugefügten Scheitelpunkte können durch Syntaxfilter begrenzt werden, die nur lexikalische Einheiten eines bestimmten Wortteils auswählen. Beispielsweise können Sie nur Substantive und Verben berücksichtigen, die dem Diagramm hinzugefügt werden sollen. Daher werden wir potenzielle Kanten erstellen, die nur auf Beziehungen basieren, die zwischen Substantiven und Verben hergestellt werden können.

Die jedem Scheitelpunkt zugeordnete Punktzahl wird auf einen Anfangswert von 1 gesetzt, und der Rangfolgenalgorithmus wird gestartet. Der Ranking-Algorithmus ist eine "Abstimmung" oder "Empfehlung". Wenn ein Scheitelpunkt mit einem anderen verbunden ist, „stimmt“ er für diesen (verbundenen) Scheitelpunkt ab. Je höher die Anzahl der abgegebenen Stimmen für einen Peak ist, desto höher ist die Bedeutung dieses Peaks. Darüber hinaus bestimmt die Wichtigkeit des Voting-Top, wie wichtig das Voting selbst ist, und diese Informationen werden auch vom Ranking-Modell berücksichtigt. Daher wird die mit der Spitze verbundene Punktzahl basierend auf den abgegebenen Stimmen und der Bewertung der Spitzenwerte, die diese Stimmen abgeben, bestimmt.

Angenommen, wir haben einen Graphen G = (V, E), der durch die Eckpunkte V und Kanten E beschrieben wird. Für einen gegebenen Eckpunkt V sei eine Menge von Eckpunkten E damit verbunden. Für jeden Scheitelpunkt Vi sind In (Vi) -Scheitelpunkte und Out (Vi) -Scheitelpunkte zugeordnet, denen der Scheitelpunkt Vi zugeordnet ist. Somit kann das Gewicht des Scheitelpunkts Vi durch die Formel dargestellt werden.

S big(Vi big)= big(1d big)+d sumj inIn(Vi) frac1 midOut(Vj) midS big(Vj big)



Wobei d der Dämpfungs- / Unterdrückungsfaktor ist und einen Wert von 1 bis 0 annimmt.

Der Algorithmus sollte den Graphen mehrmals durchlaufen, um grobe Schätzungen zu erhalten.
Nachdem Sie eine ungefähre Schätzung für jeden Scheitelpunkt im Diagramm erhalten haben, werden die Scheitelpunkte in absteigender Reihenfolge sortiert. Die Eckpunkte, die oben in der Liste angezeigt werden, sind unsere gewünschten Schlüsselwörter.

Der relevanteste Satz im Text wird ermittelt, indem der Durchschnitt der Addition der Bewertungen aller Wörter im Satz ermittelt wird. Das heißt, wir addieren alle Schätzungen und dividieren durch die Anzahl der Wörter im Satz.

 iMac:YoutubeSummarizer $ cd /Users/Volodymyr/Projects/YoutubeSummarizer ; env "PYTHONIOENCODING=UTF-8" "PYTHONUNBUFFERED=1" /usr/local/bin/python3 /Users/Volodymyr/.vscode/extensions/ms-python.python-2018.11.0/pythonFiles/experimental/ptvsd_launcher.py --default --client --host localhost --port 53730 /Users/Volodymyr/Projects/YoutubeSummarizer/summarizer.py --youtube-id yA-FCxFQNHg --model /Users/Volodymyr/Projects/deepspeech/models/output_graph.pb --alphabet /Users/Volodymyr/Projects/deepspeech/models/alphabet.txt --lm /Users/Volodymyr/Projects/deepspeech/models/lm.binary --trie /Users/Volodymyr/Projects/deepspeech/models/trie --crop-time 900 Done downloading, now converting ... ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers built with Apple LLVM version 10.0.0 (clang-1000.11.45.5) configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-opencl --enable-videotoolbox libavutil 56. 22.100 / 56. 22.100 libavcodec 58. 35.100 / 58. 35.100 libavformat 58. 20.100 / 58. 20.100 libavdevice 58. 5.100 / 58. 5.100 libavfilter 7. 40.101 / 7. 40.101 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 3.100 / 5. 3.100 libswresample 3. 3.100 / 3. 3.100 libpostproc 55. 3.100 / 55. 3.100 Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, wav, from 'yA-FCxFQNHg.wav': Metadata: encoder : Lavf58.20.100 Duration: 00:17:27.06, bitrate: 1536 kb/s Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s Stream mapping: Stream #0:0 -> #0:0 (pcm_s16le (native) -> pcm_s16le (native)) Press [q] to stop, [?] for help Output #0, wav, to 'result-yA-FCxFQNHg.wav': Metadata: ISFT : Lavf58.20.100 Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, mono, s16, 256 kb/s Metadata: encoder : Lavc58.35.100 pcm_s16le size= 28125kB time=00:15:00.00 bitrate= 256.0kbits/s speed=1.02e+03x video:0kB audio:28125kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000271% Loading model from file /Users/Volodymyr/Projects/deepspeech/models/output_graph.pb TensorFlow: v1.11.0-9-g97d851f04e DeepSpeech: unknown Warning: reading entire model file into memory. Transform model file into an mmapped graph to reduce heap usage. 2018-12-14 17:42:03.121170: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA Loaded model in 0.5s. Loading language model from files /Users/Volodymyr/Projects/deepspeech/models/lm.binary /Users/Volodymyr/Projects/deepspeech/models/trie Loaded language model in 3.17s. Running inference. Building top 20 keywords... {'communicate', 'government', 'repetition', 'terrorism', 'technology', 'thinteeneighty', 'incentive', 'ponsibility', 'experience', 'upsetting', 'democracy', 'infection', 'difference', 'evidesrisia', 'legislature', 'metriamatrei', 'believing', 'administration', 'antagethetruth', 'information', 'conspiracy'} Building summary sentence... intellectually antagethetruth administration thinteeneighty understanding metriamatrei shareholders evidesrisia recognizing ponsibility communicate information legislature abaddoryis technology difference conspiracy repetition experience government protecting categories mankyuses democracy campaigns primarily attackers terrorism believing happening infection seriously incentive upsetting testified fortunate questions president companies prominent actually platform massacre powerful building poblanas thinking supposed accounts murdered function unsolved perverse recently fighting opposite motional election children watching traction speaking measured nineteen repeated coverage imagined positive designed together countess greatest fourteen attacks publish brought through explain russian opinion winking somehow welcome trithis problem looking college gaining feoryhe talking ighting believe happens connect further working ational mistake diverse between ferring Inference took 76.729s for 900.000s audio file. 

Zusammenfassung


Die Ideen, die Ihnen in den Sinn kommen, können heute viel schneller umgesetzt werden als noch vor drei oder vier Jahren. Probieren Sie es aus, experimentieren Sie! Ich denke, dass künstliche Intelligenz in erster Linie die Intelligenz der Ingenieure ist, die damit arbeiten.

Der Code ist in meinem Github-Repository verfügbar.

Source: https://habr.com/ru/post/de433532/


All Articles