Skip to content
Announcements6 min read

Potato 2.7.1 : la transcription existe déjà

Potato 2.7.1 lit directement 21 formats de transcription et de sous-titres, les charge depuis des fichiers annexes posés à côté de vos médias, et livre un convertisseur qui transforme un dossier de sorties de reconnaissance vocale en fichier de données prêt à annoter.

Potato Team

Presque personne n'arrive dans un outil d'annotation avec de l'audio brut et rien d'autre. On arrive avec une transcription. Quelqu'un a fait tourner Whisper sur un dossier d'entretiens. Quelqu'un a récupéré les sous-titres de cent conférences. Quelqu'un a hérité d'un corpus de TextGrid d'un projet de terrain achevé en 2019.

Et là, l'outil lui demande d'écrire un script de conversion.

Potato 2.7.1 sert à supprimer cette étape. Il lit directement 21 formats de transcription et de sous-titres, les charge depuis des fichiers posés à côté de vos médias au lieu d'exiger que tout soit collé dans un fichier de données, et il inclut un convertisseur pour le cas où vous voulez malgré tout un fichier de données au bout.

Potato 2.7.1 : 21 formats de transcription en entrée, un modèle de tours en sortiePotato 2.7.1

21 formats en entrée, un modèle en sortie

Contre 6 auparavant. La liste complète est sur la page Formats de transcription, mais en gros : neuf sortes de sorties de reconnaissance vocale (Whisper JSON, WhisperX et autres JSON diarisés, whisper.cpp, Whisper TSV, AWS Transcribe, Deepgram, AssemblyAI, Rev.ai, SPoRC), six formats de sous-titres et de sous-titrage (SubRip, WebVTT, SubStation Alpha, TTML et DFXP, YouTube json3, YouTube srv1/srv2/srv3), trois venus du monde de l'alignement forcé (NIST CTM, Praat TextGrid, ELAN EAF), et trois formes génériques pour les données qui viennent de tout autre part.

Les formats d'alignement sont l'ajout dont nous sommes le plus contents. L'export vers EAF et TextGrid existait déjà, donc les annotations en couches font désormais l'aller-retour : ingérez un alignement existant, corrigez-le dans Potato, renvoyez-le vers ELAN ou Praat.

La détection se fait sur la forme des données plutôt que sur l'extension du fichier, ce qui veut dire qu'un fichier WebVTT nommé captions.txt est quand même analysé comme du WebVTT, et que la même transcription fonctionne incorporée ou lue depuis le disque sans changement de configuration.

Les temps par mot et la confiance par segment sont conservés quand la source les fournit. Les formats nativement au niveau du mot, comme CTM, Deepgram et AssemblyAI, sont regroupés en tours au changement de locuteur, plus un seuil de pause.

Une transcription affichée en bulles de locuteur colorées, avec un bouton de lecture par tour et une question d'étiquetage en ligneQuel que soit le format entré, voilà ce qui sort

Les fichiers annexes

Votre outil de reconnaissance vocale a déjà écrit les fichiers dans une disposition sensée : le média ici, la transcription à côté. Il n'y avait aucune bonne raison de vous obliger à aplatir tout ça dans un bloc de données, alors vous pouvez désormais pointer dessus :

json
{"id": "int_001", "conversation": {"audio": "media/int_001.mp3",
                                   "transcript": "media/int_001.srt"}}

Les chemins sont résolus relativement à task_dir et passent par la même validation contre la traversée de répertoires que tout autre chemin configuré. Si vos données contiennent réellement des transcriptions d'une ligne qui ressemblent à des noms de fichiers, transcript_is_path: false désactive l'heuristique.

L'avantage pratique, c'est que vos transcriptions restent des fichiers. Vous pouvez les comparer, les régénérer et les transmettre à quelqu'un d'autre, au lieu d'en avoir une copie fossilisée dans un tableau JSON.

Un convertisseur pour l'autre cas

Parfois, vous voulez bien un seul fichier de données. potato transcripts parcourt un dossier, apparie chaque transcription à son média par nom de base, dérive les identifiants d'item des noms de fichiers, et écrit le résultat :

bash
potato transcripts ./whisper_out --media-dir ./audio -o data/interviews.json

--dry-run n'écrit rien et vous dit ce qu'il a trouvé, ce qui est aussi la première chose à lancer quand une transcription s'affiche comme un seul bloc indifférencié :

text
Scanned 3 file(s):
  interview_01.json      Whisper JSON      42 turns    891.4s  undiarized
  interview_02.json      WhisperX JSON     51 turns   1120.8s  2 speaker(s): SPEAKER_00, SPEAKER_01
  interview_03.json      Whisper JSON      38 turns    754.2s  undiarized

3 item(s), 131 turn(s).

Un fichier annoncé comme plain text est presque toujours un .txt de Whisper qui s'est mélangé à la sortie .json. Le .txt ne porte aucun horodatage, et vous ne pouvez pas les récupérer sans refaire tourner le modèle. Ce seul fait explique la plupart des signalements « pourquoi ma transcription s'affiche mal » que nous voyons.

--emit-config imprime un config.yaml correspondant à côté du fichier de données.

Un seul vocabulaire pour quatre schémas

audio_dialogue, speech_transcript, voice_interaction et tiered_annotation analysaient chacun les données de transcription à leur façon et acceptaient des sous-ensembles de formats différents, sans que personne puisse expliquer pourquoi. Ils partagent maintenant un seul normaliseur, donc ce que l'un accepte, les quatre l'acceptent.

Les configurations existantes ne changent pas. Chaque schéma conserve son ancienne analyse en repli, et toute forme de transcription qui fonctionnait avant fonctionne encore, octet pour octet.

tiered_annotation gagne aussi le préremplissage optionnel depuis la transcription. Pointez transcript_field sur votre transcription et une couche arrive déjà remplie, de sorte que les annotateurs corrigent un alignement existant au lieu de resegmenter la parole depuis zéro :

yaml
  - annotation_type: tiered_annotation
    name: tiers
    source_field: audio_url
    media_type: audio
    tiers:
      - name: utterance
        labels:
          - name: speech
            color: "#7c3aed"

Les intervalles préremplis ne sont pas enregistrés tant qu'un annotateur ne les a pas réellement modifiés, donc une amorce laissée intacte n'est jamais comptée à tort comme du travail humain.

Ce que Potato ne fait toujours pas

Il ne transcrit pas, et il ne diarise pas. La reconnaissance vocale tourne en amont. Potato lit ce que votre chaîne a produit.

La question revient parce que Potato fait tourner un modèle Whisper local, pour le mode Think-Aloud, qui enregistre les annotateurs pendant qu'ils parlent au travail. C'est une fonction de capture qui vise vos annotateurs, pas votre corpus. Autre chose, même mot.

La confiance au niveau du mot est analysée et conservée dans le modèle de données quand la source la fournit, mais il n'existe pas encore d'interface pour la consulter.

Et certains formats n'ont aucun analyseur du tout : SAMI, MicroDVD, SubViewer, Transcriber .trs, EXMARaLDA, CHAT/CHILDES, RTTM seul, et les sorties natives de Montreal Forced Aligner ou de Gentle. Convertissez-les d'abord. Nous publions cette liste parce qu'une liste de formats pris en charge dont rien n'est exclu ne vaut pas grand-chose.

Documentation

Mise à jour

bash
pip install --upgrade potato-annotation==2.7.1

Vous n'avez aucune configuration à changer. Toute forme de transcription que Potato acceptait avant, il l'accepte encore.