common-voice / commonvoice-fr

Tooling for producing French dataset for Common Voice
100 stars 24 forks source link

Augmenter le corpus de son avec de nouveaux jeux de données #91

Open lissyx opened 4 years ago

drzraf commented 3 years ago

J'ai une question particulière à cet égard : J'ai testé deepspeech sur des commandes vocales avec du vocabulaire technique du genre lancer un terminal, connecter, exécuter, apache, ssh, ... avec des résultats évidemment peu concluants.

Je crains que des corpus trop littéraires ne soient pas les plus adaptés pour des usages quotidien de la société technique moderne, particulièrement pour commander vocalement un OS :)

Ce ne sont pas des termes très usités mais je souhaiterais savoir si dans une certaine mesure des "collections" particulières/thématiques pourraient être créées et alimentées directement depuis https://commonvoice.mozilla.org/

lissyx commented 3 years ago

Ce ne sont pas des termes très usités mais je souhaiterais savoir si dans une certaine mesure des "collections" particulières/thématiques pourraient être créées et alimentées directement depuis https://commonvoice.mozilla.org/

C'est déjà le cas avec la première campagne qui a eu lieu cette année de mots clefs d'activation. La seconde approche, pour de l la commande spécifique, c'est de construire un scorer spécifique : https://deepspeech.readthedocs.io/en/master/Scorer.html?highlight=language%20model#building-your-own-scorer

drzraf commented 3 years ago

Je ne parle pas d'un mot clef d'activation, mais de deepspeech en tâche de fond décodant aussi aisément du français littéraire que des commandes vocales. À la <copy>, <paste> de DragonNaturallySpeaking & co. Je pense ça Mycroft Adapt.

Admettons que je construise mon vocabulaire avec quelques centaines de commandes (au moins simple, du genre <verbe> <nom> .*) donc sûrement des phrases combinées à partir d'un set de quelques dizaines de commande (exécuter, ouvrir, fermer, défiler, ...), et quelques centaines de noms (texte, libreoffice, image, firefox, ...), ...

... comment procéder ensuite pour l'enregistrement vocal ?

lissyx commented 3 years ago

Je ne parle pas d'un mot clef d'activation, mais de deepspeech en tâche de fond décodant aussi aisément du français littéraire des des commandes vocales. À la <copy>, <paste> de DragonNaturallySpeaking & co. Je pense ça Mycroft Adapt.

Admettons que je construise mon vocabulaire avec quelques centaines de commandes (au moins simple, du genre <verbe> <nom> .*) donc sûrement des phrases combinées à partir d'un set de quelques dizaines de commande (exécuter, ouvrir, fermer, défiler, ...), et quelques centaines de noms (texte, libreoffice, image, firefox, ...), ...

... comment procéder ensuite pour l'enregistrement vocal ?

* Est-ce un "projet" à faire dans son coin de A à Z : sélection du corpus de phrases, enregistrement (en déployant "mozilla-voice", le software, chez soi) ?

* Ou bien est-ce quelque chose qui puisse trouver sa place quelque part autour de https://commonvoice.mozilla.org/fr afin de mutualiser et de profiter de l'infrastructure existante ?

J'ai bien compris, et ma remarque tient : on a pas mal expérimenté sur ce type d'usage, modèle générique (anglais ou français par ex), et scorer "dédié" avec des commandes. Ça marche vraiment pas mal, tu devrais commencer par essayer ça, 99.99% des cas d'utilisation où les gens voulaient comme toi faire des enregistrements dédiés ont été correctements résolus avec le modèle générique et un scorer spécifique.

drzraf commented 3 years ago

Ok.

Puisque je ne suis pas être le premier (francophone) à souhaiter utiliser mon shell (et environement de bureau) par commandes vocales, y a-t-il des projets/références dans le domaine, basées sur deepspeech (pour le TTS) ? Quel serait le meilleur endroit pour de telles discussions ?

Je me suis fait ce dataset.txt:

01-utils.txt (45 words) # generic/app'independants utils/functions
03-vocabulary.txt (20 words) # Common hardware & desktop environment vocabulary
04-space-moves.txt (36 words) # Various expressions of a state
08-states.txt (27 words) # Reflection of stats
10-computing-keywords.txt (32 words) # Generic keywords
10-shell-builtins.txt (30 words) # shell builtins language and process management
12-commands.txt (87 words) # some useful commands, service & daemon names
15-general-programming.txt (10 words) # General programming language functions

Puis: ./generate_lm.py --input_txt dataset.txt --output_dir out/ --top_k 500 --kenlm_bins ../kenlm/bin/ --arpa_order 5 --max_arpa_memory "85%" --arpa_prune "0|0|1" --binary_a_bits 255 --binary_q_bits 8 --binary_type trie (Je n'ai pas cherché à tweaker les paramètres)

Calculating word statistics ...
  Your text file has 289 words in total
  It has 266 unique words
  Your top-500 words are 100.0000 percent of all words
  Your most common word "git" occurred 13 times
  The least common word in your top-k is "out" with 1 times
  The first word with 2 occurrences is "up" at place 10

Creating ARPA file ...
=== 1/5 Counting and sorting n-grams ===
Reading scorer/out/lower.txt.gz
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
****************************************************************************************************
Unigram tokens 289 types 269
=== 2/5 Calculating and sorting adjusted counts ===
Chain sizes: 1:3228 2:2080082432 3:3900154624 4:6240247296 5:9100360704
kenlm/lm/builder/adjust_counts.cc:49 in void lm::builder::{anonymous}::StatCollector::CalculateDiscounts(const lm::builder::DiscountConfig&) threw BadDiscountException because `s.n[j] == 0'.
Could not calculate Kneser-Ney discounts for 1-grams with adjusted count 4 because we didn't observe any 1-grams with adjusted count 3; Is this small or artificial data?
Try deduplicating the input.  To override this error for e.g. a class-based model, rerun with --discount_fallback

Traceback (most recent call last):
  File "./generate_lm.py", line 210, in <module>
    main()
  File "./generate_lm.py", line 201, in main
    build_lm(args, data_lower, vocab_str)
  File "./generate_lm.py", line 97, in build_lm
    subprocess.check_call(subargs)
  File "/usr/lib/python3.8/subprocess.py", line 364, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['../sources/kenlm/bin/lmplz', '--order', '5', '--temp_prefix', 'out/', '--memory', '85%', '--text', 'out/lower.txt.gz', '--arpa', 'out/lm.arpa', '--prune', '0', '0', '1']' died with <Signals.SIGABRT: 6>.

J'ai bien réussi à passer outre avec --discount_fallback, mais je me demande:

  1. --discount_fallback : est-ce bien correct?
  2. J'ai évidemment préfèré ne pas hardcoder des combinaisons de "phrases" (tel que toutes les sous-commandes de git, openssl ou gnupg) mais plutôt des mots génériques.
  3. L'étape suivante suppose de créer le scorer à partir du LM ce qui ne devrait pas être bien difficile (avec --alphabet, --default_alpha, ...), mais j'anticipe alors : Une fois ce scorer en main je crains de ne pas obtenir de résultats concluants étant donné que nombre de termes n'ont jamais eu de voix associée dans commonvoice (et puis il y a les termes français, les acronymes, les mots-clefs spécifiques non proprement anglais) ==> Retour à la case départ ??
lissyx commented 3 years ago

Quel serait le meilleur endroit pour de telles discussions ?

Discourse, en anglais, y'a pas mal de ressources déjà: https://discourse.mozilla.org/c/deepspeech/247

--discount_fallback : est-ce bien correct?

dans ce cas oui

L'étape suivante suppose de créer le scorer à partir du LM ce qui ne devrait pas être bien difficile (avec --alphabet, --default_alpha, ...), mais j'anticipe alors : Une fois ce scorer en main je crains de ne pas obtenir de résultats concluants étant donné que nombre de termes n'ont jamais eu de voix associée dans commonvoice (et puis il y a les termes français, les acronymes, les mots-clefs spécifiques non proprement anglais) ==> Retour à la case départ ??

Créer le scorer se fait en quelques minutes, tu perdras moins de temps à le faire et à essayer. Pour des commandes comme ça, j'avais eu étonnamment de bons résultats quand j'ai fait des essais.

Le scorer est là pour ré-équilibrer la partie acoustique, si celui-ci ne contient que tes commandes, du coup une prononciation approximative "suffira".

Collecter des données améliorera forcément les résultats, mais c'est un processus beaucoup plus complexe.

@drzraf Par contre, la discussion dérive énormément de l'objet d'origine de cette issue, donc ça serait bien de continuer ailleurs, que ce soit sur le forum anglophone ou francophone.

drzraf commented 3 years ago

Je reviens vers le sujet:

Pour référence: https://github.com/mozilla/common-voice/pull/1191#issuecomment-401628632 Pour référence une liste de corpus sur une page (avant passage à Ortholang)

lissyx commented 3 years ago

Je reviens vers le sujet:

* [ ]  http://litterature-jeunesse-libre.fr/bbs/ (1200 livres)

* [ ]  [Gallica](https://gallica.bnf.fr/services/engine/search/sru?version=1.2&operation=searchRetrieve&query=dc.format%2520adj%2520%2522epub%2522%2520and%2520provenance%2520adj%2520%2522bnf.fr%2522%2520sortby%2520indexationdate/sort.descending) (3820 livres)

* [ ]  [Une compilation babelio](https://www.babelio.com/liste/10301/Les-romans-libres-de-droits-domaine-publicbien-) (106 classiques)

* [ ]  [De la poésie](https://www.de-plume-en-plume.fr/Parcourir/A-Decouvrir/Domaine-Public)

* [ ]  Source de divers corpus libres au Canada: https://www.bibliothequedequebec.qc.ca/abonnement/droits_auteur/oeuvres_libres_droit.aspx

Quant à Ortolang je me demande si tous/certains/quelques corpus doivent servir de source textuelles ou bien simplement être combinés aux dataset avec leurs enregistrements vocaux propres lors de la compilation préalable à l’entraînement.

Il faut réaliser les importeurs pour ces jeux de données. Je vois Gallica, j'avais regardé y'a quelques années déjà, et c'était pas exploitable réellement :

@drzraf Si c'est uniquement pour rajouter du texte brut à lire sur le site :

drzraf commented 3 years ago

Ouch, encore raté. Effectivement : "corpus de son" (Quoique je suggère de corpus vocal ou corpus audio).

Sur http://lig-getalp.imag.fr/fr/corpus/ il y en a aussi une liste:

Il y a l'alignement automatique basé sur des DVD (http://tvd.niderb.fr/corpus/ / @roy-a) mais je suppose qu'il faudrait des sources audiovisuelles, dotées de sous-titres, libres de droit.

Le plus intéressant selon moi, pour faire avancer le projet d'un bon :

=> Transcription automatique de milliers d'heures d'archives TV / radiophonique FR. Mais malheureusement je n'ai pas su trouver les datasets correspondant...

lissyx commented 3 years ago
* [](https://core.ac.uk/download/pdf/48228923.pdf)

=> Transcription automatique de milliers d'heures d'archives TV / radiophonique FR. Mais malheureusement je n'ai pas su trouver les datasets correspondant...

C'est un peu le même soucis pour tout le monde. Perso j'essaie de profiter des vacances que j'ai enfin pu prendre pour déconecter complètement, donc ne prends pas mal si je ne réponds pas rapidement.

Ne pas oublier que travailler sur un alignement ça va nécessiter beaucoup de taff, tu peux peut-être utiliser http://github.com/mozilla/DSAlign (j'ai jamais trop pris le temps de le faire) avec le dernier modèle releasé : il faut vraiment que les jeux de données que tu peux obtenir soient de taille intéressante (plusieurs centaines d'heures) pour que ce soit """rentable"""