Skip to content

Mode Think-Aloud

Les annotateurs parlent pendant qu'ils travaillent et Potato conserve la transcription mot à mot comme justification. La reconnaissance vocale tourne entièrement en local avec faster-whisper : aucun audio ne quitte la machine, et il n'y a ni API cloud ni LLM dans la chaîne.

Nouveau dans la v2.7.0

Avant les LLM, la référence pour comprendre un jugement était le protocole de pensée à voix haute, et il n'a jamais survécu au contact des outils d'annotation. Le mode Think-Aloud laisse simplement les annotateurs parler pendant qu'ils travaillent.

La transcription mot à mot est conservée comme justification, délibérément non résumée, parce que paraphraser un protocole de pensée à voix haute contamine l'objet même que l'on cherche à recueillir. Les étiquettes peuvent être validées à la voix au moyen de formulations fixées, repérées par un analyseur à base de règles, sans aucun LLM dans la chaîne.

La reconnaissance vocale tourne entièrement en local grâce à faster-whisper, qui fonctionne en temps réel sur CPU avec le modèle tiny.en de 39 Mo. L'audio ne quitte jamais la machine, et il n'y a aucune API cloud à appeler ni facture au token à payer.

Note : Think-Aloud transcrit vos annotateurs. Si vous voulez annoter des transcriptions que vous possédez déjà, issues de Whisper, d'une API ASR cloud ou de sous-titres téléchargés, c'est une autre fonctionnalité : voir Formats de transcription. On les confond parce que Whisper intervient dans les deux.

Une transcription mot à mot du raisonnement parlé avec une étiquette détectée à la voix : la chaîne de raisonnement humaine, à comparer à celle du modèle.

Enregistrer la chaîne de raisonnement humaine

Il ne s'agit pas seulement de recueillir des justifications. Think-Aloud capture la façon dont une personne raisonne réellement jusqu'à une étiquette, ce qui vous permet de confronter cette chaîne de raisonnement humaine à celle d'un modèle sur le même élément.

L'annotation de récompense de processus de Potato découpe le raisonnement d'un modèle, étape par étape. Think-Aloud capture celui d'une personne. Ce sont deux surfaces de capture, et c'est en les mettant côte à côte sur le même élément que les divergences intéressantes apparaissent.

Fonctionnement

  1. L'annotateur appuie sur 🎤 Penser à voix haute et parle librement.
  2. L'audio est capturé par tranches complètes de six secondes et transcrit en local.
  3. Pour valider une étiquette à la voix, il emploie l'une des formulations acceptées :
    • "I label this Polite" / "I'd call it neutral"
    • "My answer is impolite"
    • "Final answer: polite" / "I go with neutral"
  4. La détection sélectionne automatiquement l'option correspondante dans l'interface, la chaîne d'enregistrement habituelle se déclenche et la pastille confirme : Entendu : Impolite ✓. Prononcer une nouvelle formule plus tard change l'étiquette : c'est la dernière validation qui l'emporte.
  5. Avec require_spoken_label: true, appuyer sur Suivant sans avoir validé d'étiquette déclenche un rappel unique montrant la formulation attendue. Un second Suivant laisse passer, et cliquer sur les étiquettes fonctionne toujours.

Tout ce qui est dit pendant la réflexion est ignoré. « This seems polite, but… » ne valide rien. Seules les formulations fixées valident, et c'est ce qui suffit à rendre l'analyse par règles adéquate. Les erreurs d'écoute sont absorbées par la correspondance floue des étiquettes : « in polite » se résout donc en Impolite.

Installation

bash
pip install faster-whisper   # local STT; first recording downloads the model (~39 MB)

Le navigateur a besoin de l'autorisation micro. localhost compte comme un contexte sécurisé.

Configuration

yaml
thinkaloud:
  enabled: true
  schema: politeness          # scheme whose labels can be spoken (default: first radio)
  stt: auto                   # faster_whisper | mock | auto
  model: tiny.en              # tiny.en is CPU real-time; base.en is sturdier
  chunk_seconds: 6            # recording chunk length
  require_spoken_label: true  # nudge on Next without a committed label
  # stems:                    # override accepted phrasing regexes (advanced)
  # fillers: [um, uh, hmm, i guess, maybe]
  # language: en
OptionPar défautDescription
sttautofaster_whisper (local), mock (tests et développement), ou auto, qui choisit faster-whisper et renvoie une erreur explicite s'il manque.
modeltiny.enN'importe quel identifiant de modèle faster-whisper.
chunk_seconds6Chaque tranche est un fichier audio complet.
stemsintégréesRacines regex des formulations acceptées ; chacune capture les mots qui suivent.
fillersum, uh, hmm, …Lexique du compteur d'hésitations.
require_spoken_labeltrueRappel unique sur le bouton Suivant quand rien n'a été validé.

Ce que vous obtenez

  • Des flux de justification mot à mot alignés sur chaque couple (annotateur, instance), la formule d'étiquetage étant isolée à part. La transcription moins la formule de validation constitue la justification.
  • Des signaux d'hésitation déterministes : nombre de tranches silencieuses et nombre de mots de remplissage sur un lexique configurable, calculés par arithmétique plutôt que par des modèles.
  • Une page de revue sur /thinkaloud/review (administrateur) avec, pour chaque session, la transcription, l'étiquette validée à la voix, la confiance et les statistiques d'hésitation.
  • L'annotation mains libres comme effet de bord, avec un vrai gain d'accessibilité et un soulagement des TMS.

Données et API

Les transcriptions sont écrites dans {output_annotation_dir}/thinkaloud/transcripts.jsonl (en ajout seul, un enregistrement par tranche).

Point de terminaisonMéthodeAuthObjet
/thinkaloud/api/chunkPOSTsessionTranche audio multipart → transcription + détection
/thinkaloud/api/textPOSTsessionTranche de texte (voie sans audio)
/thinkaloud/api/stateGETsessionAgrégat de session pour une instance
/thinkaloud/reviewGETadministrateurPage de revue des transcriptions
/thinkaloud/api/exportGETadministrateurToutes les sessions en JSON

Notes de conception

  • L'analyseur travaille sur une fenêtre glissante des deux dernières tranches, si bien qu'une formule à cheval sur une frontière de tranche est quand même détectée.
  • La correspondance des étiquettes est d'abord exacte, puis par préfixe, puis via difflib au seuil de 0.8, en préférant les correspondances exactes. « polite » n'entre jamais en collision floue avec « Impolite ».
  • Ajouter un moteur de reconnaissance vocale consiste à dériver STTBackend dans potato/thinkaloud/stt.py et à l'enregistrer dans create_stt.

Pour aller plus loin