Générateur d'astuces d'arts

Explication du projet

Mon projet se concentre autour d'un genre de vidéo particulière sur Youtube: les tutoriels d'arts. Etant un grand fan de ce genre de vidéo à mes heures perdues, j'avais envie de travailler sur cette facette numérique de la culture populaire de l'art: pour leurs caractères ultra honête et simple dans la forme, presque naïf, qui fait contraste avec la vision contemporaine et intellectualisée de l'art, ainsi que pour la poésie parfois surréaliste ou déconcertante qui peut en emerger. Je voulais aussi exploiter le côté tutoriel du net, cette idée fascinante de "how to", c'est-à-dire cette idée qu'il suffit de suivre une suite d'étapes pour arriver à un résultat et que cette connaissance est aujourd'hui ultra-accessible via internet (bien que rarement aussi claire et unique qu'on ne le pense).

L'idée est de prendre des phrases venant de ces tutoriels d'art, pour essayé d'en recréer de nouveaux types de tutoriels ou d'astuces artistiques. Certaines de ces phrases, une foi isolé en dehors du cadre de Youtube, peuvent être surprenament inspirantes ou décalées. Je vois ce projet principalement comme une tentative de poésie emergent d'un procédé de decontextualisation. C'est aussi une façon de jouer sur les contrastes culturels des différentes sphères du monde de l'art, et de revendiquer d'une certain façon cette pratique simple et populaire de faire les choses.

J'ai donc décidé de creer un script (melant différents types de programes) qui permet d'extirper des phrases automatiquement de tutoriels Youtube. Comme Youtube à maintenant assez souvent des pistes sous-titres auto-générées sur base de l'audio, j'ai choisi d'utiliser cette voie la. Le script va selectionner et isoler aléatoirement un phrase dans les sous-titres d'un tutoriel d'art Youtube (pris lui aussi au hasard) et la présenter comme une "astuce d'art automatique" (qui sera directement basée sur les tendances Youtube du moment). L'astuce sera affichée sans aucune référence à la vidéo youtube correspondante, dans cette idée de décontextualisation pour provoquer un effet interessant. En gros, c'est une espèce d'oracle qui génére une astuce d'art à chaque execution, de façon entièrement automatique et randomisée. Evidemment ces astuces ne sont pas souvent des instructions claires de tutoriel, mais elles se retrouvent mélangées à la vie intime du ou de la youtuber-euse, ainsi que brouiller par le langage orale et sa déformation par le procédé d'auto-génération des pistes sous-titres. Cela ne pose aucun problème au contraire! Dans le premier cas, cela ajoute à la dimension de subjectivité et de personnalité qui fait justement le charme de ces tutoriels Youtube. Dans le deuxième, c'est un reflet des technologies actuelles sur ce genre de pratiques qui est montré, c'est-à-dire l'écran à travers lequel toute cette communauté vie.

J'ai pu finir cette partie du projet. Voici une selection de quelque phrases (que j'ai trouvées particulièrement sympas) que le programe à pu sortir. Le design de présentation des astuces ainsi que le nom proposé pour le projet "Actual Art Tips by Actual Artists" ne sont pas forcément définitifs. Différentes idées d'utilisation et de diffusion de ce matériel sont encore en construction.

Quelques Motivations Théoriques

D'un point de vue purement théorique, je m'étais premièrement interessé aux différences entre les différents types d'interfaces numériques, entre autre aux possibilités qu'offrent les programes utilisables dans les CLI (Command Line Interfaces) face aux interfaces graphiques. J'ai réaliser un petit Google Slides sur le sujet dans le cadre d'une présentation: https://docs.google.com/presentation/d/1fSy9b0mJ1mggkwvHxXDssEmfVSxkGkU0CCjlOp36LSA/edit?usp=sharing. Un des avantages claires du CLI est de pouvoir utiliser differents programes directement au sein de cette même interface. On peut donc combiner des applications déjà existantes avec des nouveaux petits programes écrit de toutes pièces, et composer des nouvelles machineries en les executant à tour de rôle grâce à certaines commandes propre aux CLI. Comme je ne m'étais pas encore penché sur cette 'phylosophie' de programation, j'en ai profité pour exploiter cette idée de générateur d'astuce d'art qui semblait convenir à cette façon de faire.

Un détail plutôt important: je suis sur Windows et ces techniques de script varient totallement en fonction de l'OS, par les programes accessibles et par une utilisation du terminal assez différente. J'avais du coup recherché un moyen de faire une machine virtuel Linux sur Windows, un cadre beaucoup plus adapté pour faire tout cela. Une possibilitée interesante est celle du WSL, "Windows Subsystem for Linux", qui est directement activable dans les paramètres de Windows 10 (Voir: https://docs.microsoft.com/en-us/windows/wsl/install-win10 )! Cependant je suis resté sur Windows, car chaque outils ou fichiers que je voulais utiliser devait être installé et manipuler dans le terminal de ce Linux Subsystem (car pas d'interface graphique), ce qui créait des problèmes de compatibilité, et complexifiait la tâche quand toutes mes manipulations de fichiers et programmes sont normalement faites sous Windows... (aussi par habitude je suppose...)

Construction du projet

Je vais maintenant détailler un peu la construction technique de ce générateur d'astuces d'arts. Son fonctionnement est divisé en différentes applications qui gèrent chacunes différentes parties du processus:

  1. Rechercher les vidéos correspondant au mots clés "art tutorial" sur Youtube et choisir une de ces vidéos aléatoirement.

  2. Télécharger la piste sous-titre de cette vidéo.

  3. Traiter ce texte afin de pouvoir en extirper une phrase aléatoirement.

  4. Automatiser les 3 premières étapes en un seul script.

1. l'API Youtube

La première étape est donc d'executer une recherche sur youtube au sein d'un programe, sans passer par l'interface graphique de Youtube. Pour cela on utilise ce qu'on appelle une API, c'est-à-dire une Application Programing Interface. En gros, une API est l'interface d'une application qui est mise à disposition pour programer de nouvelle chose en utilisant les fonctionnalités de cette application. Si on visualise l'application comme une boite noire (dont les méchanismes nous sont cachés), l'API est la partie extérieur de la boite, qui communique avec l'environement, et qu'on peut re-cabler dans un but précis. Contrairement à l'application, l'API ne renvoie pas un rendu final, mais des données sous formes plus brutes, à traiter et à recombiner. Par exemple Google Calendar, possède une API (mise en place par Google) qui permet d'utiliser ses fonctionnalitées de calendrier au sein d'autre sites web ou d'autres programes. Quand on lance une requête à l'API de Google Calendar, elle ne nous renvoie donc pas une page en html finie d'un calendrier mais juste les données demandées par la requête dans un format plus brut. Notons que les API ne sont pas propres au web, et existent pour divers types d'applications. Pour executer cette recherche automatique de vidéo sur Youtube j'utilise donc l'API "Youtube Data", proposée par Google.

Premièrement, afin de pouvoir envoyer une requête à l'API Youtube, on a besoin d'un compte gmail. L'utilisation de l'API est directement lié à ce compte. Les informations pour activer l'API Youtube sont expliquées à l'url suivante: https://developers.google.com/youtube/v3/getting-started. Il faut créer un projet et activer l'API de Google désirée, on obtient alors une clé de connection, qui permet de nous identifier quand on lance une requête. On peut également consulter nos connections à l'API grâce à un dashboard: https://console.developers.google.com/apis. Le nombre de requête par jour est malheureusement limité et dépend du type de requête lancée (que Google pondère en "units").

Notons qu'il y a deux moyen différent d'identification lors d'une requête:

  1. une clé secrête

  2. un token OAuth 2.0

Le deuxième système est plus complexe, en gros il permet de créer une application ou les utilisateurs peuvent envoyer des requêtes en s'identifiant grâce à leur propre compte gmail. Il est également nécessaire si on veut écrire des données via l'API (poster un commentaire sur une vidéo par exemple). Comme mon programe tourne en local et n'a pas besoin d'écrire, la clé secrête est suffisante.

Maintenant que l'accès à l'API Youtube est activer il faut coder l'action de recherche sur Youtube par l'API. Cela se fait le plus souvent en lancant une requête sous la forme d'une adresse url, bien qu'il existe des librairies qui simplifient la chose. Il y a plusieurs possibilités pour la formuler: on peut utiliser des commandes curl dans l'interpreteur de commandes, ou faire un script en java ou en python par exemple. J'ai d'abord essayé de le faire en curl, mais après pas mal de tentative ou l'identification ne marchait pas j'ai abandonné. L'avantage était de directement le faire en quelques lignes dans le CLI. Finalement j'ai choisi de faire un script python, qui peut paraître plus complexe car plus long, mais cela reste assez directe et permet une bien plus grande flexibilité au final. Il est préférable de suivre toute les étapes de ce tutoriel afin d'avoir python ainsi que certaine librairies bien installées pour pouvoir lancer des requêtes à l'API Youtube: https://developers.google.com/youtube/v3/quickstart/python. Sur ce site se trouve également toutes la documentation ainsi que des exemples pour utiliser l'API Youtube en python. J'ai d'abord essayé de trouver d'autre librairie et de voir s'il y avait des méthodes plus instinctives pour cela, mais les librairies données par Google dans la documentation ci-dessus semblent la façon la plus pratique au final. Du coup je suis parti de cet extrait pour lancer une recherche, que j'ai modifié par la suite: https://developers.google.com/youtube/v3/code_samples/python#search_by_keyword. Cet extrait est directement utilisable dans le terminal en le lancant comme ceci:

python youtube_search.py --q art+tutorial

Je l'ai ensuite modifié afin qu'au lieux de me renvoyer toute la listes de réponse à la recherche (sous la forme d'un dictionnaire python), il me renvoie juste une vidéo choisie aléatoirement (une addresse url). J'ai également du ajouter différentes conditions de test tel que le fait que la vidéo possède bien une piste sous-titre en anglais, ce qui a demandé des requêtes supplémentaires à l'API.

2. Youtube-dl

La deuxième étape est donc de télécharger les sous-titres de la vidéo selectionné. Pour cette étape, j'ai choisi d'utiliser un programe en ligne de commande assez pratique, youtube-dl: https://rg3.github.io/youtube-dl/. Il permet de télécharger des vidéos youtube directement via le terminal. Ma commande customisée se présente comme ceci:

youtube-dl -o [filename] "[youtube url]" --skip-download --write-auto-sub --sub-format ttml --sub-lang en

Ou [filename] est le nom du fichier qui va être créé contenant les sous-titres et [youtube url] est l'url séléctionné par la première étape. Cette commande ne télécharge pas la vidéo mais juste les sous-titres en anglais en format ttml. En fait l'API Youtube permet également de télécharger des sous-titres, mais comme il y a un nombre maximum de requêtes par jour j'ai préféré utiliser youtube-dl qui est bien plus pratique.

3. Words processing

Maintenant qu'on a les sous-titres correspondant à la vidéo choisie il faut les traiter afin d'en extirper une phrase. J'ai décidé de faire un deuxième script en python qui gererait tout la partie de traitement du texte à partir du fichier .ttml jusqu'à la phrase finale selectionnée. Le format .ttml possède plein de tags semblables à du .html qui précise les meta-datas ainsi que le timing de chaques bouts de phrases dans la vidéo, il faut donc d'abord en extirper juste le texte brut. Pour cela j'ai utiliser les regex ou regular expression qui permettent de chercher et remplacer tout type de patterns dans du texte.

Note: au début j'ai utilisé sed un comand line program qui permet de faire des 'search and replace' à base de regex. Cependant, comme les étapes suivantes étaient en python j'ai trouvé ça plus simple d'integrer cette partie au script aussi.

Voici la documentation pour utiliser des regex en python: https://docs.python.org/3/howto/regex.html

On a donc à ce point le texte brut de la vidéo choisie, mais un problème plutôt complexe se pose: comment délimiter le début et la fin des phrases? En effet, la plupart des sous-titres sont automatiquement générés et ne possèdent ni ponctuation, ni segmentation en phrases distinctes. Si je selectionne juste une ligne au hasard, cela correspond à un certain timing de la vidéo mais ne fait pas pour autant une phrase cohérente... Ce genre de problème peut s'averer assez complexe à résoudre et demande de s'interesser au NLP, le Natural Language Processing. C'est un domaine de l'informatique qui s'interesse à l'analyse ainsi qu'à la génération de texte, souvent basé sur des modèles probabilistes et des grandes bases de données. Par exemple pour deviner ou commence une phrase, on peut prendre un grand texte déjà segmenté en phrase et regarder le nombre de foi que chaque mot commence une phrase et en déduire ainsi des probabilités pour traiter un texte non-segmenté. J'ai finalement pu résoudre ce problème de façon assez simple en deux étapes:https://www.quora.com/Natural-Language-Processing-What-are-the-ways-to-do-Sentence-Boundary-Detection-in-English.

Comme indiqué, la première étape est de ré-introduire une ponctuation dans le texte grâce au réseau de neurone entrainé à ce but: http://bark.phon.ioc.ee/punctuator. Pour cela il faut donc envoyer une requête POST à ce site dans le script en python. Voici de la documentation sur comment envoyer des requêtes POST en python: http://docs.python-requests.org/en/latest/user/quickstart/. On reçois donc en retour le texte ponctué.

La deuxième étape est de diviser en phrase, pour cela on utilise une librairie de NLP en python appelée NLTK, toute la documentation nécéssaire est ici: http://textminingonline.com/dive-into-nltk-part-ii-sentence-tokenize-and-word-tokenize.

On à enfin notre piste de sous-titre segmentée en phrases claires et on peut donc facilement en selectionner une au hasard. J'ai choisi d'enlever les phrases en debut et fin de vidéo afin d'avoir moins de chance de tomber sur des introductions ou commentaires sur la chaine youtube et d'avoir plus de chances de tombé sur du contenu propre au tutoriel.

4. Automatisation du Script

L'étape finale est d'automatiser les différentes parties du processus. Pour cela, j'ai utilisé un fichier batch (.bat). C'est plus ou moins l'équivalent sur Windows, bien que plus rudimentaire, des shell scripts (.sh) sur les systèmes Unix. En fait, un fichier batch est juste un fichier texte ou chaque ligne contient une commande. Ces commandes vont juste s'executer successivement dans l'interpreteur de commande Windows. J'ai donc créé un fichier batch qui ressemble à ceci:

python youtube_search.py --q art+tutorial
set /p url= < url.txt
youtube-dl -o howtoart "%url%" --skip-download --write-auto-sub --sub-format ttml --sub-lang en
python tuto_gen.py

Comme le processus est scindé en différents programes, j'ai utilisé des fichiers .txt afin de faire passer les informations de l'un à l'autre. Par exemple, le premier script youtube_search.py a été re-modifié pour écrire l'url de la vidéo selectionné dans un fichier url.txt. La deuxième ligne du fichier batch crée une variable qui reprend l'url dans ce dernier fichier. Ensuite on execute youtube-dl avec cette variable en input pour télécharger les sous-titres correspondant. Ce fichier de sous-titres est lu par le dernier script qui génére l'output finale. Dans son ensemble le script accède deux fois à internet via des API, une première foi pour rechercher la vidéo sur youtube, une deuxième foi pour rajouter de la ponctuation aux sous-titres grâce au neural network.

Suite du projet

Différents aspects du projet sont encore à terminer. Notamment la question de présentation de ces tips. Mon idée est mettre en place un bot sur Twitter qui posterais automatiquement, chaque jours, une astuce différente généré par le script en temps réel. Bien que j'ai déjà des bots Twitter fonctionels, il reste la question de la présentation: quel esthétique est donnée à ce bot (avatar, communication visuel, slogan)? Une autre question qu'il reste est si les astuces sont postées comme du texte brut ou incorporées dans un template prédéfinis? J'ai commencé des tests templates minimalistes automatiques, sur processing, qui se base sur le thumbnail de la vidéo sélectionnée pour chaque astuce.