
[ad_1]
Comment utiliser Whisper d’OpenAI pour une meilleure recherche vocale (audio)
OpenAI Chuchotement est un nouveau modèle de pointe (SotA) de synthèse vocale. Il peut presque parfaitement transcrire la parole dans des dizaines de langues et même gérer une mauvaise qualité audio ou un bruit de fond excessif.
Le domaine de la création parlée a toujours été quelque peu hors de portée des cas d’utilisation de ML. Whisper change cela pour les cas d’utilisation centrés sur la parole. Nous démontrerons la puissance de Whisper aux côtés d’autres technologies telles que les transformateurs et la recherche vectorielle en créant une nouvelle recherche YouTube améliorée.
La recherche sur YouTube est bonne mais a ses limites, surtout lorsqu’il s’agit de répondre aux questions. Avec des billions d’heures de contenu, il devrait y avoir une réponse à presque toutes les questions.
Pourtant, si nous avons une question spécifique comme « qu’est-ce que le CLIP d’OpenAI ? » au lieu d’une réponse concise, nous obtenons de nombreuses vidéos très longues que nous devons regarder.
Et si tout ce que nous voulons, c’est une courte explication de 20 secondes ? La recherche YouTube actuelle n’a pas de solution pour cela. Peut-être y a-t-il une bonne raison d’encourager les utilisateurs à regarder autant de vidéos que possible (plus d’annonces, n’importe qui ?).
Whisper est la solution à ce problème et bien d’autres impliquant la parole. Cet article explorera l’idée derrière une meilleure recherche vocale.
Nous voulons obtenir des horodatages spécifiques qui répondent à nos requêtes de recherche. YouTube prend en charge les liens spécifiques au temps dans les vidéos, donc une recherche plus précise avec ces liens devrait être possible.
Pour construire quelque chose comme ça, nous devons d’abord transcrire l’audio de nos vidéos en texte. YouTube sous-titre automatiquement chaque vidéo, et les sous-titres sont corrects – mais OpenAI vient d’ouvrir quelque chose appelé « Whisper ».
Whisper est mieux décrit comme le GPT-3 ou DALL-E 2 de la parole en texte. Il est open source et peut transcrire l’audio en temps réel ou plus rapide avec des performances inégalées. Cela semble être l’option la plus excitante.
Une fois que nous avons notre texte transcrit et les horodatages pour chaque extrait de texte, nous pouvons passer à la question-réponse (QA) partie. QA est une forme de recherche où l’on donne une requête en langage naturel comme « qu’est-ce que Whisper d’OpenAI ? » nous pouvons renvoyer des réponses précises en langage naturel.
Nous pouvons considérer l’assurance qualité comme la forme la plus intuitive de recherche d’informations, car c’est ainsi que nous demandons des informations aux autres. La seule différence étant que nous tapons la question dans une barre de recherche plutôt que de la communiquer verbalement – pour l’instant.
Comment tout cela se présente-t-il ?
Maintenant, colorions les détails et parcourons les étapes.
La première étape consiste à télécharger nos données vidéo YouTube et à extraire l’audio attaché à chaque vidéo. Heureusement, il existe une bibliothèque Python pour exactement ce qui s’appelle pytube
.
Avec pytube
, nous fournissons un identifiant vidéo (trouvable dans la barre d’URL ou téléchargeable si vous avez une chaîne). J’ai directement téléchargé un résumé du contenu de la chaîne, y compris les identifiants, les titres, les dates de publication, etc., via YouTube. Ces mêmes données sont disponibles via Hugging Face Jeux de données dans un ensemble de données appelé jamescalam/channel-metadata
.
Nous sommes surtout intéressés par Title
et Video ID
des champs. Avec l’ID vidéo, nous pouvons commencer à télécharger les vidéos et à enregistrer les fichiers audio avec pytube
.
Après cela, nous devrions trouver ~108 fichiers MP3 audio stockés dans le ./mp3
annuaire.
Avec ceux-ci, nous pouvons passer à la transcription avec Whisper d’OpenAI.
Le modèle de synthèse vocale Whisper d’OpenAI est entièrement open source et disponible via Bibliothèque Whisper d’OpenAI disponible pour pip install
via GitHub :
pip install git+https://github.com/openai/whisper.git
Whisper s’appuie sur un autre logiciel appelé FFMPEG pour convertir les fichiers vidéo et audio. L’installation pour cela varie selon le système d’exploitation [1]; les éléments suivants couvrent les systèmes primaires :
# on Ubuntu or Debian
sudo apt update && sudo apt install ffmpeg# on Arch Linux
sudo pacman -S ffmpeg# on MacOS using Homebrew (https://brew.sh/)
brew install ffmpeg# on Windows using Chocolatey (https://chocolatey.org/)
choco install ffmpeg# on Windows using Scoop (https://scoop.sh/)
scoop install ffmpeg
Après l’installation, nous téléchargeons et initialisons le grand modèle, en le déplaçant vers le GPU si CUDA est disponible.
D’autres modèles sont disponibles, et un GPU (ou même un CPU) plus petit devrait être envisagé. Nous transcrivons l’audio comme suit :
À partir de là, nous avons une liste d’environ 27 000 segments audio transcrits, y compris du texte aux côtés des secondes de début et de fin. Si vous attendez longtemps que cela soit traité, une version prédéfinie de l’ensemble de données est disponible. Les instructions de téléchargement se trouvent dans la section suivante.
La dernière cellule ci-dessus manque la logique requise pour extraire et ajouter les métadonnées de notre videos_dict
que nous avons initialisé plus tôt. On rajoute ça comme ça :
Après avoir traité tous les segments, ils sont enregistrés dans un fichier en tant que fichier de lignes JSON avec :
Avec cela prêt, construisons les intégrations QA et le composant de recherche vectorielle.
Sur le visage étreignant Jeux de donnéesvous pouvez trouver les données que j’ai extraites dans un ensemble de données appelé jamescalam/youtube-transcriptions
:
Pour l’instant, l’ensemble de données ne contient que des vidéos de ma chaîne personnelle, mais j’ajouterai plus de vidéos d’autres chaînes axées sur le ML à l’avenir.
Les données comprennent un court morceau de texte (l’audio transcrit). Chaque morceau est relativement dénué de sens :
Idéalement, nous voulons des morceaux de texte 4 à 6 fois plus grands que cela pour capturer suffisamment de sens pour être utiles. Pour ce faire, nous parcourons simplement l’ensemble de données et fusionnons chaque six segments.
Quelques choses se passent ici. Tout d’abord, nous fusionnons tous les six segments, comme expliqué précédemment. Cependant, faire cela seul réduira probablement beaucoup de sens entre les segments liés.
Une technique courante pour éviter de couper des segments connexes consiste à ajouter des chevaucher entre les segments, où stride
est utilisé. Pour chaque étape, nous nous déplaçons Trois segments vers l’avant lors de la fusion six segments. En faisant cela, tous les segments significatifs coupés en une étape seront inclus dans la suivante.
Avec cela, nous avons des morceaux de texte plus grands et plus significatifs. Nous devons maintenant les encoder avec un modèle d’intégration QA. De nombreux modèles d’assurance qualité préformés et hautement performants sont disponibles via Hugging Face Transformateurs et le Transformateurs de phrases bibliothèque. Nous en utiliserons un appelé multi-qa-mpnet-base-dot-v1
.
En utilisant ce modèle, nous pouvons coder un passage de texte en un significative vecteur à 768 dimensions avec model.encode("<some text>")
. Encoder tous nos segments à la fois ou les stocker localement nécessiterait trop de calcul ou de mémoire – nous initialisons donc d’abord la base de données vectorielle où ils seront stockés :
Nous devrions voir que l’index (base de données vectorielles) est actuellement vide avec un total_vector_count
de 0
. Nous pouvons maintenant commencer à encoder nos segments et insérer les intégrations (et les métadonnées) dans notre index.
C’est tout ce dont nous avions besoin pour préparer nos données et tout ajouter à la base de données vectorielles. Il ne reste plus qu’à interroger et à renvoyer des résultats.
Les requêtes sont simples à effectuer ; nous:
- Encodez la requête à l’aide du même modèle d’intégration que nous avons utilisé pour encoder les segments.
- Passez la requête à notre index.
Nous le faisons avec les éléments suivants :
Ces résultats sont pertinents pour la question; trois, en particulier, proviennent d’un endroit similaire dans la même vidéo. Nous pourrions vouloir améliorer l’interface de recherche pour qu’elle soit plus conviviale qu’un Jupyter Notebook.
L’un des moyens les plus simples de mettre en place une interface utilisateur de recherche basée sur le Web est d’utiliser Hugging Face Les espaces et Streamlit (ou Gradio si préféré).
Nous n’allons pas parcourir le code ici, mais si vous connaissez Streamlit, vous pouvez créer une application de recherche assez facilement en quelques heures. Ou vous pouvez utiliser notre exemple et le faire en 5 à 10 minutes.
Vous pouvez tester l’application ici. Lors d’une nouvelle requête pour "what is OpenAI's clip?"
nous renverrons plusieurs résultats fusionnés à partir d’une seule vidéo. Avec cela, nous pouvons passer à chaque segment en cliquant sur la partie du texte qui nous intéresse le plus.
Essayez quelques requêtes supplémentaires telles que :
What is the best unsupervised method to train a sentence transformer?What is vector search?How can I train a sentence transformer with little-to-no data?
[ad_2]
Télécharger ici