{"id":2059,"date":"2023-06-18T20:50:51","date_gmt":"2023-06-18T18:50:51","guid":{"rendered":"http:\/\/www.fabienm.eu\/wordpress\/?p=2059"},"modified":"2023-06-20T08:24:56","modified_gmt":"2023-06-20T06:24:56","slug":"un-programme-pour-apprendre-ses-tables-de-multiplications","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/wordpress\/2023\/06\/18\/un-programme-pour-apprendre-ses-tables-de-multiplications\/","title":{"rendered":"Un programme pour apprendre ses tables de multiplications"},"content":{"rendered":"\n<p>En primaire on commence \u00e0 apprendre ses tables de multiplications. Bien s\u00fbr on se sert des parents pour les r\u00e9citer avant le contr\u00f4le. Cependant, les parents \u00e7a passe leurs temps \u00e0 faire des commentaires. Alors pourquoi ne pas utiliser la machine pour les r\u00e9citer sans jugement ?<\/p>\n\n\n\n<p>C&rsquo;est d&rsquo;autant plus facile aujourd&rsquo;hui avec la multitude de langages de haut niveau disponibles. Par exemple en python on peut tartiner un programme vite fait bien fait comme cela :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code lang=\"\" class=\"hljs language-php \">import random\n\nmaxcount = <span class=\"hljs-number\">10<\/span>\ncount = maxcount\n\n<span class=\"hljs-keyword\">while<\/span> count != <span class=\"hljs-number\">0<\/span>:\n    a = random.randint(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">9<\/span>)\n    b = random.randint(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">9<\/span>)\n    \n    res = input(f<span class=\"hljs-string\">\"{a} x {b} = \"<\/span>)\n    <span class=\"hljs-keyword\">if<\/span> (int(res) != int(a*b)):\n        <span class=\"hljs-keyword\">print<\/span>(f<span class=\"hljs-string\">\"NAN! C'\u00e9tait {a*b}\"<\/span>)\n        count = maxcount\n    <span class=\"hljs-keyword\">else<\/span>:\n        <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Bien\"<\/span>)\n        count = count - <span class=\"hljs-number\">1<\/span>\n    <span class=\"hljs-keyword\">print<\/span>(f<span class=\"hljs-string\">\"Encore {count} multiplications \u00e0 trouver\"<\/span>)\n\n<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"BRAVO \\o\/\"<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Le programme fonctionne plut\u00f4t bien, on peut ensuite l&rsquo;am\u00e9liorer et ajouter des d\u00e9fis. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">R\u00e9ponse parl\u00e9e<\/h2>\n\n\n\n<p>L\u00e0, il faut un clavier pour r\u00e9pondre, \u00e7a suppose de savoir s&rsquo;en servir. Et c&rsquo;est plus long pour r\u00e9pondre. Si on veut faire un programme bas\u00e9 sur la vitesse et qui \u00e9vite d&rsquo;avoir \u00e0 conna\u00eetre l&rsquo;usage du clavier on peut essayer de passer par la reconnaissance vocale avec la biblioth\u00e8que open-source <a href=\"https:\/\/alphacephei.com\/vosk\/\">Vosk<\/a> par exemple. Ce logiciel a l&rsquo;avantage de pouvoir s&rsquo;utiliser hors ligne.<\/p>\n\n\n\n<p>L&rsquo;installation de vosk est d&rsquo;une simplicit\u00e9 biblique :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code lang=\"\" class=\"hljs language-javascript \">$ sudo python3 -m pip install vosk\n&#91;sudo] Mot de passe de fabien\u00a0:        \nCollecting vosk\n  Downloading vosk<span class=\"hljs-number\">-0.3<\/span><span class=\"hljs-number\">.45<\/span>-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (<span class=\"hljs-number\">7.2<\/span> MB)\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 <span class=\"hljs-number\">7.2<\/span>\/<span class=\"hljs-number\">7.2<\/span> MB <span class=\"hljs-number\">22.7<\/span> MB\/s eta <span class=\"hljs-number\">0<\/span>:<span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nCollecting tqdm\n  Downloading tqdm<span class=\"hljs-number\">-4.65<\/span><span class=\"hljs-number\">.0<\/span>-py3-none-any.whl (<span class=\"hljs-number\">77<\/span> kB)\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 <span class=\"hljs-number\">77.1<\/span>\/<span class=\"hljs-number\">77.1<\/span> KB <span class=\"hljs-number\">13.6<\/span> MB\/s eta <span class=\"hljs-number\">0<\/span>:<span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nRequirement already satisfied: requests <span class=\"hljs-keyword\">in<\/span> \/usr\/lib\/python3\/dist-packages (<span class=\"hljs-keyword\">from<\/span> vosk) (<span class=\"hljs-number\">2.25<\/span><span class=\"hljs-number\">.1<\/span>)\nCollecting websockets\n  Downloading websockets<span class=\"hljs-number\">-11.0<\/span><span class=\"hljs-number\">.3<\/span>-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (<span class=\"hljs-number\">129<\/span> kB)\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 <span class=\"hljs-number\">129.9<\/span>\/<span class=\"hljs-number\">129.9<\/span> KB <span class=\"hljs-number\">6.6<\/span> MB\/s eta <span class=\"hljs-number\">0<\/span>:<span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nCollecting cffi&gt;=<span class=\"hljs-number\">1.0<\/span>\n  Downloading cffi<span class=\"hljs-number\">-1.15<\/span><span class=\"hljs-number\">.1<\/span>-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (<span class=\"hljs-number\">441<\/span> kB)\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 <span class=\"hljs-number\">441.8<\/span>\/<span class=\"hljs-number\">441.8<\/span> KB <span class=\"hljs-number\">11.6<\/span> MB\/s eta <span class=\"hljs-number\">0<\/span>:<span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nCollecting srt\n  Downloading srt<span class=\"hljs-number\">-3.5<\/span><span class=\"hljs-number\">.3<\/span>.tar.gz (<span class=\"hljs-number\">28<\/span> kB)\n  Preparing metadata (setup.py) ... done\nCollecting pycparser\n  Downloading pycparser<span class=\"hljs-number\">-2.21<\/span>-py2.py3-none-any.whl (<span class=\"hljs-number\">118<\/span> kB)\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 <span class=\"hljs-number\">118.7<\/span>\/<span class=\"hljs-number\">118.7<\/span> KB <span class=\"hljs-number\">8.2<\/span> MB\/s eta <span class=\"hljs-number\">0<\/span>:<span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nBuilding wheels <span class=\"hljs-keyword\">for<\/span> collected packages: srt\n  Building wheel <span class=\"hljs-keyword\">for<\/span> srt (setup.py) ... done\n  Created wheel <span class=\"hljs-keyword\">for<\/span> srt: filename=srt<span class=\"hljs-number\">-3.5<\/span><span class=\"hljs-number\">.3<\/span>-py3-none-any.whl size=<span class=\"hljs-number\">22445<\/span> sha256=<span class=\"hljs-number\">5<\/span>d6b0eded4562ad3cdb720ee5932cf7a7c377a463690f0cfef649372d3501355\n  Stored <span class=\"hljs-keyword\">in<\/span> directory: <span class=\"hljs-regexp\">\/root\/<\/span>.cache\/pip\/wheels\/d7\/<span class=\"hljs-number\">31<\/span>\/a1\/<span class=\"hljs-number\">18e1<\/span>e7e8bfdafd19e6803d7eb919b563dd11de380e4304e332\nSuccessfully built srt\nInstalling collected packages: websockets, tqdm, srt, pycparser, cffi, vosk\nSuccessfully installed cffi<span class=\"hljs-number\">-1.15<\/span><span class=\"hljs-number\">.1<\/span> pycparser<span class=\"hljs-number\">-2.21<\/span> srt<span class=\"hljs-number\">-3.5<\/span><span class=\"hljs-number\">.3<\/span> tqdm<span class=\"hljs-number\">-4.65<\/span><span class=\"hljs-number\">.0<\/span> vosk<span class=\"hljs-number\">-0.3<\/span><span class=\"hljs-number\">.45<\/span> websockets<span class=\"hljs-number\">-11.0<\/span><span class=\"hljs-number\">.3<\/span>\n<span class=\"hljs-attr\">WARNING<\/span>: Running pip <span class=\"hljs-keyword\">as<\/span> the <span class=\"hljs-string\">'root'<\/span> user can result <span class=\"hljs-keyword\">in<\/span> broken permissions and conflicting behaviour <span class=\"hljs-keyword\">with<\/span> the system package manager. It is recommended to use a virtual environment instead: https:<span class=\"hljs-comment\">\/\/pip.pypa.io\/warnings\/venv<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>On pourra ensuite essayer de convertir un \u00e9chantillon de voix lisant &rsquo;42&rsquo; :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code lang=\"\" class=\"hljs language-javascript \">$ vosk-transcriber -l fr -i vosk\/quarante-deux.mp3 -o quarante-deux.txt\nvosk-model-small-fr<span class=\"hljs-number\">-0.22<\/span>.zip: <span class=\"hljs-number\">100<\/span>%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| <span class=\"hljs-number\">40.3<\/span>M\/<span class=\"hljs-number\">40.3<\/span>M &#91;<span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">02<\/span>&lt;<span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>, <span class=\"hljs-number\">20.8<\/span>MB\/s] \nLOG (VoskAPI:ReadDataFiles():model.cc:<span class=\"hljs-number\">213<\/span>) Decoding params beam=<span class=\"hljs-number\">13<\/span> max-active=<span class=\"hljs-number\">7000<\/span> lattice-beam=<span class=\"hljs-number\">4<\/span>\nLOG (VoskAPI:ReadDataFiles():model.cc:<span class=\"hljs-number\">216<\/span>) Silence phones <span class=\"hljs-number\">1<\/span>:<span class=\"hljs-number\">2<\/span>:<span class=\"hljs-number\">3<\/span>:<span class=\"hljs-number\">4<\/span>:<span class=\"hljs-number\">5<\/span>:<span class=\"hljs-number\">6<\/span>:<span class=\"hljs-number\">7<\/span>:<span class=\"hljs-number\">8<\/span>:<span class=\"hljs-number\">9<\/span>:<span class=\"hljs-number\">10<\/span>\nLOG (VoskAPI:RemoveOrphanNodes():nnet-nnet.cc:<span class=\"hljs-number\">948<\/span>) Removed <span class=\"hljs-number\">0<\/span> orphan nodes.\nLOG (VoskAPI:RemoveOrphanComponents():nnet-nnet.cc:<span class=\"hljs-number\">847<\/span>) Removing <span class=\"hljs-number\">0<\/span> orphan components.\nLOG (VoskAPI:ReadDataFiles():model.cc:<span class=\"hljs-number\">248<\/span>) Loading i-vector extractor <span class=\"hljs-keyword\">from<\/span> \/home\/fabien\/.cache\/vosk\/vosk-model-small-fr<span class=\"hljs-number\">-0.22<\/span>\/ivector\/final.ie\nLOG (VoskAPI:ComputeDerivedVars():ivector-extractor.cc:<span class=\"hljs-number\">183<\/span>) Computing derived variables <span class=\"hljs-keyword\">for<\/span> iVector extractor\nLOG (VoskAPI:ComputeDerivedVars():ivector-extractor.cc:<span class=\"hljs-number\">204<\/span>) Done.\nLOG (VoskAPI:ReadDataFiles():model.cc:<span class=\"hljs-number\">282<\/span>) Loading HCL and G <span class=\"hljs-keyword\">from<\/span> \/home\/fabien\/.cache\/vosk\/vosk-model-small-fr<span class=\"hljs-number\">-0.22<\/span>\/graph\/HCLr.fst \/home\/fabien\/.cache\/vosk\/vosk-model-small-fr<span class=\"hljs-number\">-0.22<\/span>\/graph\/Gr.fst\nLOG (VoskAPI:ReadDataFiles():model.cc:<span class=\"hljs-number\">308<\/span>) Loading winfo \/home\/fabien\/.cache\/vosk\/vosk-model-small-fr<span class=\"hljs-number\">-0.22<\/span>\/graph\/phones\/word_boundary.int\n<span class=\"hljs-attr\">INFO<\/span>:root:Recognizing vosk\/quarante-deux.mp3\n<span class=\"hljs-attr\">INFO<\/span>:root:{<span class=\"hljs-string\">'partial'<\/span>: <span class=\"hljs-string\">'quarante-deux'<\/span>}\n<span class=\"hljs-attr\">INFO<\/span>:root:{<span class=\"hljs-string\">'partial'<\/span>: <span class=\"hljs-string\">'quarante-deux'<\/span>}\n<span class=\"hljs-attr\">INFO<\/span>:root:{<span class=\"hljs-string\">'partial'<\/span>: <span class=\"hljs-string\">'quarante-deux'<\/span>}\n<span class=\"hljs-attr\">INFO<\/span>:root:{<span class=\"hljs-string\">'partial'<\/span>: <span class=\"hljs-string\">'quarante-deux'<\/span>}\n<span class=\"hljs-attr\">INFO<\/span>:root:{<span class=\"hljs-string\">'partial'<\/span>: <span class=\"hljs-string\">'quarante-deux'<\/span>}\n<span class=\"hljs-attr\">INFO<\/span>:root:{<span class=\"hljs-string\">'partial'<\/span>: <span class=\"hljs-string\">'quarante-deux'<\/span>}\n<span class=\"hljs-attr\">INFO<\/span>:root:{<span class=\"hljs-string\">'partial'<\/span>: <span class=\"hljs-string\">'quarante-deux'<\/span>}\n<span class=\"hljs-attr\">INFO<\/span>:root:File quarante-deux.txt processing complete\n<span class=\"hljs-attr\">INFO<\/span>:root:Execution time: <span class=\"hljs-number\">0.766<\/span> sec; xRT <span class=\"hljs-number\">0.426<\/span>\n\n$ cat quarante-deux.txt \nquarante-deux\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Bon pour le \u00aboffline\u00bb c&rsquo;est pas tout \u00e0 fait \u00e7a puisqu&rsquo;il faut quand m\u00eame t\u00e9l\u00e9charger le mod\u00e8le pour la langue (ici &lsquo;-l fr&rsquo; pour fran\u00e7ais). Mais, une fois t\u00e9l\u00e9charg\u00e9 il n&rsquo;y a plus \u00e0 y revenir.<\/p>\n\n\n\n<p>Test\u00e9 sur d&rsquo;autre \u00e9chantillons \u00e7a marche relativement bien. Il nous reste quelque probl\u00e8mes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nous avons utilis\u00e9 un \u00e9chantillon sonore enregistr\u00e9. Notre objectif est de pouvoir \u00ab\u00e9couter\u00bb la r\u00e9ponse sans avoir \u00e0 utiliser le clavier.<\/li>\n\n\n\n<li>Le r\u00e9sultat est donn\u00e9 en texte, il va donc falloir le convertir en nombre.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">test_microphone.py<\/h2>\n\n\n\n<p>Le projet <a href=\"https:\/\/github.com\/alphacep\/vosk-api\">Vosk<\/a> propose <a href=\"https:\/\/github.com\/alphacep\/vosk-api\/blob\/master\/python\/example\/test_microphone.py\">un script en python<\/a> pour tester son microphone. Ce script transcrit en temps r\u00e9el le texte reconnue.<\/p>\n\n\n\n<p>On peut  reprendre le script et modifier la boucle d&rsquo;affichage du texte pour convertir en nombre le texte reconnue puis v\u00e9rifier que le calcul est bon.<\/p>\n\n\n\n<p>\u00c7a tombe bien car en python il y a un module qui fait la conversion texte en nombre : <a href=\"https:\/\/pypi.org\/project\/text2num\/\">text2num<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Text2num<\/h2>\n\n\n\n<p>Convertir un texte en un nombre est chose facile avec <a href=\"https:\/\/pypi.org\/project\/text2num\/\">text2num<\/a>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code lang=\"\" class=\"hljs language-javascript \">$ sudo python3 -m pip install text2num\nCollecting text2num\n  Downloading text2num<span class=\"hljs-number\">-2.5<\/span><span class=\"hljs-number\">.0<\/span>.tar.gz (<span class=\"hljs-number\">38<\/span> kB)\n  Preparing metadata (setup.py) ... done\nBuilding wheels <span class=\"hljs-keyword\">for<\/span> collected packages: text2num\n  Building wheel <span class=\"hljs-keyword\">for<\/span> text2num (setup.py) ... done\n  Created wheel <span class=\"hljs-keyword\">for<\/span> text2num: filename=text2num<span class=\"hljs-number\">-2.5<\/span><span class=\"hljs-number\">.0<\/span>-py3-none-any.whl size=<span class=\"hljs-number\">58681<\/span> sha256=fd5ff29e88655c69c08cee37608129ffd7fbbed2cc96ef59ddc9ce4b77443bda\n  Stored <span class=\"hljs-keyword\">in<\/span> directory: <span class=\"hljs-regexp\">\/root\/<\/span>.cache\/pip\/wheels\/<span class=\"hljs-number\">49<\/span>\/b2\/af\/<span class=\"hljs-number\">5<\/span>db9aefd179867bbae782e4e1aefa78490377f561b4c97f34e\nSuccessfully built text2num\nInstalling collected packages: text2num\nSuccessfully installed text2num<span class=\"hljs-number\">-2.5<\/span><span class=\"hljs-number\">.0<\/span>\n<span class=\"hljs-attr\">WARNING<\/span>: Running pip <span class=\"hljs-keyword\">as<\/span> the <span class=\"hljs-string\">'root'<\/span> user can result <span class=\"hljs-keyword\">in<\/span> broken permissions and conflicting behaviour <span class=\"hljs-keyword\">with<\/span> the system package manager. It is recommended to use a virtual environment instead: https:<span class=\"hljs-comment\">\/\/pip.pypa.io\/warnings\/venv<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>L&rsquo;utilisation se fait de la mani\u00e8re suivante (dans une console <a href=\"https:\/\/pypi.org\/project\/ipython\/\">ipython<\/a>):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code lang=\"\" class=\"hljs language-javascript \">In &#91;<span class=\"hljs-number\">2<\/span>]: <span class=\"hljs-keyword\">from<\/span> text_to_num <span class=\"hljs-keyword\">import<\/span> text2num\n\nIn &#91;<span class=\"hljs-number\">3<\/span>]: text2num(<span class=\"hljs-string\">\"quarante-deux\"<\/span>, <span class=\"hljs-string\">\"fr\"<\/span>)\nOut&#91;<span class=\"hljs-number\">3<\/span>]: <span class=\"hljs-number\">42<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Il reste \u00e0 ajouter le module json de python pour convertir la sortie texte et nous avons notre squelette de programme de r\u00e9citation des multiplications :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code lang=\"\" class=\"hljs language-php \">            rec = KaldiRecognizer(model, args.samplerate)\n            count = MAX_OPERATION_NB \n            <span class=\"hljs-keyword\">while<\/span> count != <span class=\"hljs-number\">0<\/span>:\n                <span class=\"hljs-keyword\">print<\/span>(f<span class=\"hljs-string\">\"Courage, plus que {count} op\u00e9rations\"<\/span>)\n                a = random.randint(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">9<\/span>)\n                b = random.randint(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">9<\/span>)\n                <span class=\"hljs-keyword\">print<\/span>(f<span class=\"hljs-string\">\"Combien font {a} x {b} ?\"<\/span>)\n                <span class=\"hljs-keyword\">while<\/span> <span class=\"hljs-keyword\">True<\/span>:\n                    data = q.get()\n                    <span class=\"hljs-keyword\">if<\/span> rec.AcceptWaveform(data):\n                        res = rec.Result()\n                        textvalue = json.loads(res).get(<span class=\"hljs-string\">\"text\"<\/span>, None)\n                        <span class=\"hljs-keyword\">if<\/span> textvalue is not None:\n                            response = my_text_2_num(textvalue)\n                            <span class=\"hljs-keyword\">if<\/span> textvalue.strip() == <span class=\"hljs-string\">\"\"<\/span>:\n                                <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"alors ?\"<\/span>)\n                            elif response &lt; <span class=\"hljs-number\">0<\/span>:\n                                <span class=\"hljs-keyword\">print<\/span>(f<span class=\"hljs-string\">\"J'ai pas compris ({textvalue})\"<\/span>)\n                            <span class=\"hljs-keyword\">else<\/span>:\n                                <span class=\"hljs-keyword\">print<\/span>(f<span class=\"hljs-string\">\"(Ta r\u00e9ponse \u00ab{textvalue}\u00bb -&gt; {response})\"<\/span>)\n                                <span class=\"hljs-keyword\">if<\/span> response == a * b:\n                                    <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Bien\"<\/span>)\n                                    count -= <span class=\"hljs-number\">1<\/span>\n                                    <span class=\"hljs-keyword\">break<\/span>\n                                <span class=\"hljs-keyword\">else<\/span>:\n                                    <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Rat\u00e9\"<\/span>)\n                                    count = MAX_OPERATION_NB\n                                    <span class=\"hljs-keyword\">break<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Le script quick &amp; dirty est disponible sur mon <a href=\"https:\/\/github.com\/Martoni\/FaisTesDevoirsAvant\/blob\/master\/python\/vosk\/multvosk.py\">d\u00e9pot github<\/a>. Le syst\u00e8me fonctionne \u00e9tonnamment bien, m\u00eame avec un vieux lenovo Thinkpad T430.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"927\" src=\"http:\/\/www.fabienm.eu\/wordpress\/wp-content\/uploads\/2023\/06\/multiplications.jpg\" alt=\"\" class=\"wp-image-2083\" srcset=\"http:\/\/www.fabienm.eu\/wordpress\/wp-content\/uploads\/2023\/06\/multiplications.jpg 400w, http:\/\/www.fabienm.eu\/wordpress\/wp-content\/uploads\/2023\/06\/multiplications-129x300.jpg 129w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure><\/div>\n\n\n<p>Maintenant que le principe est valid\u00e9 on va pouvoir \u00abgamifier\u00bb tout \u00e7a et faire de super jeux \ud83d\ude42 <\/p>\n\n\n\n<p>Mais c&rsquo;est une autre histoire.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En primaire on commence \u00e0 apprendre ses tables de multiplications. Bien s\u00fbr on se sert des parents pour les r\u00e9citer avant le contr\u00f4le. Cependant, les parents \u00e7a passe leurs temps \u00e0 faire des commentaires. Alors pourquoi ne pas utiliser la &hellip; <a href=\"http:\/\/www.fabienm.eu\/wordpress\/2023\/06\/18\/un-programme-pour-apprendre-ses-tables-de-multiplications\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[325,56,324,323],"class_list":["post-2059","post","type-post","status-publish","format-standard","hentry","category-non-classe","tag-multiplication","tag-python","tag-reconnaissance-vocale","tag-vosk"],"_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/2059","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=2059"}],"version-history":[{"count":16,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/2059\/revisions"}],"predecessor-version":[{"id":2090,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/2059\/revisions\/2090"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=2059"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=2059"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=2059"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}