Comment votre modèle retranscrit-il les chiffres?

#1
by poulpor - opened

Bonjour,
excusez-moi de vous déranger mais j'aurais une question concernant ce modèle: comment traite t-il les informations chiffrées énoncées vocalement?
Plus concrêtement, je cherche un STT optimisé pour le français, capable d'écrire "12h45" et non "douze heures quarante-cinq", car Home Assistant a besoin de valeurs chiffrées pour déclencher ses automatisations. Jusqu'ici, je ne trouve rien, tous les modèles "finetunés" fr basés sur Whisper écrivent les chiffres en toutes lettres, alors que les modèles d'origine Whisper et Faster Whisper tiny/base/small fournissent bien des chiffres à mon Home Assistant, mais sont des quiches en français bien entendu... :)

Je vous remercie pour toute aide que vous pourriez m'apporter dans ma quête infructueuse jusqu'ici..!

Bonjour,
Tout d'abord merci pour ton message ça fait chaud au coeur de voir qu'il y a d'autres personnes qui veulent faire la même chose que moi !
Je me suis enregistré en disant des heures et le modèle est bien capable de l'écrire en chiffres. Je te met les logs ici pour l'output du modèle 😀

Transcription using a multilingual Whisper will default to language detection followed by transcription instead of translation to English. This might be a breaking change for your use case. If you want to instead always translate your audio to English, make sure to pass language='en'. See https://github.com/huggingface/transformers/pull/28687 for more details.
generation_config default values have been modified to match model-specific defaults: {'suppress_tokens': [1, 2, 7, 8, 9, 10, 14, 25, 26, 27, 28, 29, 31, 58, 59, 60, 61, 62, 63, 90, 91, 92, 93, 359, 503, 522, 542, 873, 893, 902, 918, 922, 931, 1350, 1853, 1982, 2460, 2627, 3246, 3253, 3268, 3536, 3846, 3961, 4183, 4667, 6585, 6647, 7273, 9061, 9383, 10428, 10929, 11938, 12033, 12331, 12562, 13793, 14157, 14635, 15265, 15618, 16553, 16604, 18362, 18956, 20075, 21675, 22520, 26130, 26161, 26435, 28279, 29464, 31650, 32302, 32470, 36865, 42863, 47425, 49870, 50254, 50258, 50360, 50361, 50362], 'begin_suppress_tokens': [220, 50257]}. If this is not desired, please set these values explicitly.
The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass your input's attention_mask to obtain reliable results.
A custom logits processor of type <class 'transformers.generation.logits_process.SuppressTokensLogitsProcessor'> has been passed to .generate(), but it was also created in .generate(), given its parameterization. The custom <class 'transformers.generation.logits_process.SuppressTokensLogitsProcessor'> will take precedence. Please check the docstring of <class 'transformers.generation.logits_process.SuppressTokensLogitsProcessor'> to see related .generate() flags.
A custom logits processor of type <class 'transformers.generation.logits_process.SuppressTokensAtBeginLogitsProcessor'> has been passed to .generate(), but it was also created in .generate(), given its parameterization. The custom <class 'transformers.generation.logits_process.SuppressTokensAtBeginLogitsProcessor'> will take precedence. Please check the docstring of <class 'transformers.generation.logits_process.SuppressTokensAtBeginLogitsProcessor'> to see related .generate() flags.
Transcription : 12h45 13h10 14h20

On a bien tout en chiffre ! Je te met l'audio que j'ai utilisé, on sait jamais :p (Si tu utilise ce modèle pense à bien convertir en 16 kHz

Encore merci à toi !

Bonne journée !

Bonjour,
Merci beaucoup pour ta réponse rapide, détaillée ET de surcroît, positive!
Ton modèle semble donc être parfait pour l'usage d'assistant vocal en français, comme précisé dans ta présentation et c'était d'ailleurs la petite info qui m'a fait entrapercevoir un espoir!

Franchement, je pense que tu es le premier à avoir pris en compte ce besoin de retranscrire en langue française les nombres en chiffres et non en mots, rien que pour ça, bravo et merci! ;)

À vrai dire, je n'ai pas encore pu tester ton modèle car je ne parviens pas à l'utiliser, je suis très loin d'être un programmeur et je découvre à peine huggingface et les tutos pour finetuner.

J'utilise Docker, et donc une image du genre rhasspy/wyoming-whisper avec le compose suivant:
services:
wyoming-whisper:
ports:
- 10300:10300
volumes:
- /var/lib/docker/volumes/ha-whisper/data:/data
image: rhasspy/wyoming-whisper
command: --stt-library transformers --model keypa/whisper-v3-ft-common-voice-fr --language fr --debug --beam-size 2
restart: unless-stopped

Cela fonctionne pour de nombreux modèles déjà testés (deepdml/whisper-small-mix-fr, mozilla-ai/whisper-small-fr, nambn0321/ASR_french_3, etc...), mais malheureusement pas avec le tien, ni avec ton autre modèle keypa/whisper-small-fr-cv-100k. Ça semble pourtant s'initialiser normalement, j'ai un beau "INFO:main:Ready" après le démarrage du container mais aucune retranscription n'est effectuée quand de la voix lui est envoyé via Home Assistant. Pourtant les données lui parviennent bien, les logs en attestent en temps réel mais aucun texte n'est généré. J'ai un doute concernant le 16kHz, il me semble pourtant que Home Assistant bosse à cette fréquence mais je vais revérifier.

Je pourrais te passer les logs si tu as le temps d'aider un gros noob, mais je vais bien entendu continuer à chercher de mon côté.

Bon après-midi!

EDIT: le sample rate de mes commandes est bien en 16kHz, d'après les debug "assistants vocaux" de Home Assistant.

Petite update, j'ai peut-être trouvé ce qui posait problème dans mon setup!
En effet, les logs de mon container mentionnaient cette erreur:
exception=ValueError('You have explicitly specified forced_decoder_ids. Please remove the forced_decoder_ids argument in favour of input_ids or decoder_input_ids respectively.')>

J'ai donc recherché la valeur forced_decoder_ids dans les différents fichiers json et elle est présente dans config.json et generation_config.json. Le remplacement de cette valeur par "forced_decoder_ids": null, dans config.json n'a rien changé mais une fois appliqué cette modification au fichier generation_config.json, j'ai enfin obtenu des transcriptions!!!

Peux-tu me dire si cela est préjudiciable à ton modèle ou si je peux laisser ainsi?

En tout cas, grâce à ton modèle, j'ai bien mes horaires en chiffres HHhMM (ex. 18h30), je vais tester un peu plus les différents cas de figure mais franchement, tu devrais en parler sur hacf.fr, tu as actuellement le seul modèle optimisé français qui génère des chiffres arabes au lieu de ce satané texte... Je peux me tromper, mais vu que la plupart des français galèrent avec le whisper de base ou vosk, plutôt bon mais avec nombres retranscrits en texte, tu tiens une perle rare!!!

EDIT: ohlàlà, ça marche du tonnerre, sérieusement, il faut le faire connaître de la petite communauté domotique française! :D
Un container avec la modif forced_decoder_ids et zou, connecté à Home Assistant (ou autre, je ne connais pas jeedom)!!!

Hey !

Trop cool que tu aies trouvé le souci et que ça tourne maintenant !
Pour forced_decoder_ids, tu peux le laisser à "null" sans stress. Ça ne pose aucun problème au modèle — au contraire, ça évite qu’il soit “bloqué” sur un décodage imposé par Whisper et ça le laisse générer normalement. Donc tu peux garder cette modif, c’est safe.

En tout cas ça me fait super plaisir que ça marche bien chez toi, surtout pour Home Assistant. Hésite pas à tester plein de cas un peu chelous, mais normalement il gère assez bien tout ce qui est heures/chiffres.

Et merci pour ton message, vraiment — ça motive de fou 😄
Si jamais t’as besoin d’un coup de main pour Docker ou autre, je suis là !
Je vais essayer dès que j'aurai un peu de temps de le retrain sur une plus grande partie du dataset. Dans cette itération j'avais fait 100k/250k maintenant que je maîtrise un peu mieux (je suis encore un noobie dans ce monde comme toi mdr) je vais essayer de le faire avec la totalité des exemples dispo. Je te tiens au jus si j'arrive à faire ça dans un Docker proprement similaire à rhasspy/wyoming-whisper.

Bonne soirée ! 🚀

Bonsoir!
Si la modification de forced_decoder_ids en "null" est en plus bénéfique au traitement, c'est du bonus :)
Franchement je suis ravi, merci encore d'avoir fait ce boulot qu'aucun autre frenchy n'avait eu l'idée ou le courage d'entreprendre avant toi...

Je tâcherai de tester davantage ce week-end, à vrai dire, mon setup est un peu compliqué, J'utilise à la fois le STT Speech-to-phrase de Home Assistant et ton STT, grâce à une intégration HA permettant un fallback du premier vers le second STT quand il ne comprend pas la demande . L'intégration se nomme ASR PROXY et permet donc de configurer 2 STT dans HA.

Ensuite, la demande est transmise à HA et si jamais lui non plus ne pige pas la demande, elle arrive finalement à un -tout- petit modèle mistral:7b-instruct-v0.3-q2_K, cpu-only, juste pour le fun. Bon, ça n'a rien d'extraordinaire, c'est le fonctionnement normal de Home Assistant que l'on peut définir dans les réglages de son assistant vocal.

Je te remercie pour la proposition d'aide, en général je me débrouille plutôt bien avec docker, la domotique ou l'auto-hébergement en général, mais je suis totalement novice en matière d'IA. Je m'y intéresse surtout pour le fun de la découverte et la passion de la bidouille :)

Si tu penses pouvoir encore améliorer ton modèle et le rendre de surcroît simple d'accès au plus grand nombre, ce serait vraiment beau, je ne réalise pas du tout quelle serait la marge de progression possible et vais justement essayer de comprendre ce que tu entends pas "Dans cette itération j'avais fait 100k/250k",; c'est moi le gros noobie :D

Bonne fin de soirée!

Et je vois que tu as changé la nomenclature de ton modèle!

Bonjour !

Je n'ai pas encore trop fouillé dans HA mais je pense qu'un jour je testerai. Ton setup HA est trop compliqué pour mes maigres connaissances de Home Assistant xD
Par "Dans cette itération j'avais fait 100k/250k" je voulais dire que j'avais entrainé le modèle sur 100 mille exemple audio sur le 250 mille disponible dans le dataset. Je vais donc essayer cette fois-ci d'utiliser la totalité des exemples que j'ai à disposition dans le dataset (en espérant gratter quelques pourcents d'efficacité).
J'utilise Docker mais j'apprend actuellement comment en fabriquer et les faires fonctionner correctement (galère vraiment), donc je vais essayer d'intégrer le modèle on verra bien ce que ça donne ! 😀

Bon week-end

Oui j'ai changé le nom du modèle car il ne correspondait pas au nom du dataset utilisé xD, c'est plus simple pour moi de me repérer au nom du modèle pour savoir sur quoi il a été entraîné.

EDIT : je dis nimp, c'était 10k qui étaient utilisés donc on va avoir un x25 :p

Hello!
Si intégrer ton modèle à un docker est laborieux, franchement, ne te fais trop de nœuds au cerveau car le container rhasspy/wyoming-whisper et sa commande --stt-library transformers --model keypa/whisper-3-mls-fr rendent tout cela très simple (à part la modif de forced_decoder_ids à faire à la main), le modèle est téléchargé automatiquement depuis huggingface et si des modifications y sont apportées, elles seront téléchargées au prochain redémarrage du container.
Tu peux également ajouter un initial-prompt et diverses autres options que je n'utilise pas toutes:

--data-dir DATA_DIR 
--download-dir DOWNLOAD_DIR 
--device DEVICE 
--language LANGUAGE
--compute-type COMPUTE_TYPE 
--beam-size BEAM_SIZE
--cpu-threads CPU_THREADS
--initial-prompt "INITIAL_PROMPT"
--stt-library {auto,faster-whisper,transformers,sherpa,onnx-asr}
--local-files-only 
--debug 
--log-format LOG_FORMAT
--version

Pour rappel, mon docker compose de ton modèle:

services:
    wyoming-whisper:
        ports:
            - 10300:10300
        volumes:
            - /var/lib/docker/volumes/ha-whisper/data:/data
        image: rhasspy/wyoming-whisper:latest
        command: --stt-library transformers --model keypa/whisper-3-mls-fr --language fr --debug --beam-size 2
        restart: unless-stopped

Mais je comprends l'envie de faire un beau truc propre ;)
Merci pour l'explication des datasets!

Sign up or log in to comment