{"id":5979,"date":"2025-04-01T12:38:59","date_gmt":"2025-04-01T10:38:59","guid":{"rendered":"https:\/\/spgoo.org\/?page_id=5979"},"modified":"2025-12-26T08:12:28","modified_gmt":"2025-12-26T07:12:28","slug":"passy","status":"publish","type":"page","link":"https:\/\/spgoo.org\/?page_id=5979","title":{"rendered":"Passy &#8211; DPFV"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">PASSY-DPFV &#8212; resp. Gabriel Bergounioux<\/h2>\n\n\n\n<p class=\"has-text-align-center has-vivid-green-cyan-color has-text-color has-link-color wp-elements-50bdef631497f1b2da51b51738d448e7\">Appui SPGoO : Yvan Stroppa<\/p>\n\n\n<img decoding=\"async\" style=\"position:absolute;top:20px;right:50px;border-radius:30px\"  src=\"\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-23-11-28-14.png\" width=\"150px\"  \/>\n\n\n<link rel='stylesheet' id='4485-css'  href='https:\/\/spgoo.org\/wp-content\/uploads\/winp-css-js\/4485.css?ver=1747039442' type='text\/css' media='all' \/>\n\n\n\n<p>Construction d&#8217;une plateforme nomm\u00e9e <strong><a href=\"https:\/\/passy.spgoo.org\">Passy<\/a><\/strong> sur la base de la r\u00e9alisation effectu\u00e9e pour MP Tours (DeepBdd-Bddictionnairique) dans un contexte de langue fran\u00e7aise. Ce travail est r\u00e9alis\u00e9 en collaboration avec G. Bergounioux et avec la participation de l&#8217;ATILF (Nancy).<\/p>\n\n\n\n<p class=\"has-text-align-center has-vivid-green-cyan-color has-text-color has-link-color has-medium-font-size wp-elements-81099583993fafff8a631db5e945c302\">Objectif : concevoir une plateforme Web d&#8217;alimentation, de collecte et d&#8217;exploitation de donn\u00e9es phon\u00e9tiques.<\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-3ab74fe6cbcbcadeb858e3bb5a86ecc3\">Importation des donn\u00e9es du TLF<\/p>\n\n\n\n<p>Premi\u00e8re \u00e9tape: r\u00e9cup\u00e9ration des donn\u00e9es du TLF de l&#8217;ATILF pour constituer la base de d\u00e9part de notre corpus phon\u00e9tique soit 54734 entr\u00e9es.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"873\" height=\"454\" src=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/04\/architecture_passy.png\" alt=\"\" class=\"wp-image-6014\" srcset=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/04\/architecture_passy.png 873w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/04\/architecture_passy-300x156.png 300w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/04\/architecture_passy-768x399.png 768w\" sizes=\"auto, (max-width: 873px) 100vw, 873px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-50b5947e0dde1a8ae66b990b2093e73a\">Cr\u00e9ation d&#8217;un Workflow : <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"340\" src=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/04\/passy_general-1024x340.png\" alt=\"\" class=\"wp-image-6015\" srcset=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/04\/passy_general-1024x340.png 1024w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/04\/passy_general-300x100.png 300w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/04\/passy_general-768x255.png 768w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/04\/passy_general.png 1239w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Elaboration d&#8217;un workflow de traitements pour permettre \u00e0 la plateforme d&#8217;avoir un c\u00f4t\u00e9 communautaire, on envisage d\u00e8s le d\u00e9part une saisie multiple par des utilisateurs de type contributeur. Ce qui permettra d&#8217;avoir, vu le chantier, des forces vives pour alimenter et corriger les entr\u00e9es. Dans ce circuit d&#8217;alimentation deux voies sont pr\u00e9vues : une alimentation manuelle et une alimentation automatique. <\/p>\n\n\n\n<p><strong>Alimentation manuelle<\/strong> : r\u00e9serv\u00e9e aux contributeurs, elle permettra \u00e0 des utilisateurs sp\u00e9cifiques de proposer des corrections et ajouts des donn\u00e9es \u00e0 partir d&#8217;une interface d\u00e9di\u00e9e. Un environnement <\/p>\n\n\n\n<p><strong>Alimentation automatique<\/strong> : d\u00e9clench\u00e9e par le Backend de la plateforme pour l&#8217;extraction de corpus sonores. cet agent IA devra en permanence sonder des corpus existants  et des fonds sonores publics pour en extraire des s\u00e9quences et les proposer \u00e0 la plateforme. <\/p>\n\n\n\n<p>Pour ces deux circuits d&#8217;alimentation nous mettons en place un Workflow qui aura pour objectif de valider les propositions des contributeurs et de la partie IA afin de garantir une grande qualit\u00e9 des donn\u00e9es mises \u00e0 la disposition des utilisateurs. <\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-415b6933ab5a4953e2aa266d6716eb01\">Extraction des donn\u00e9es ESLO2 : <\/p>\n\n\n\n<p>Constitution et extraction des entr\u00e9es fournies par ESLO2 : le corpus nous permet d&#8217;extraire \u00e0 partir des transcriptions C des enregistrements des illustrations sonores tr\u00e8s vari\u00e9es des mots et de leur prononciation. <\/p>\n\n\n\n<p>Cr\u00e9ation d&#8217;un script python pour extraire des fichiers de transcriptions les diff\u00e9rentes informations.<\/p>\n\n\n\n<p>Pr\u00e9paration de l&#8217;environnement pour les extractions: Installation des packages suivants pour faciliter et interpr\u00e9ter les donn\u00e9es extraites dans un environnement python3.12<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip3 install spacy nlp nltk \npython -m spacy download fr_core_news.sm \npip install git+https:\/\/github.com\/ClaudeCoulombe\/FrenchLeffLemmatizer.git<\/code><\/pre>\n\n\n\n<p>Ces diff\u00e9rents package vont nous permettre d&#8217;obtenir directement la lemmatisation des mots pour constituer un lexique et la morpho-syntaxe des expressions extraites le tout enregistrer dans deux collections de notre base de donn\u00e9es <span class='tooltipsall tooltipsincontent classtoolTips3'>MongoDB<\/span> : eslo2 et lexique_eslo2<\/p>\n\n\n\n<p>Retour exp\u00e9rience du parser XML : import xml.etree.ElementTree as ET<\/p>\n\n\n\n<p>1 \/ Ce package entre les versions 3.9 et 3.12 de python a \u00e9volu\u00e9 et l&#8217;emploi de getChildren pour trouver les enfants d&#8217;une branche de la structure XML n&#8217;est plus accessible dans les derni\u00e8res versions.<\/p>\n\n\n\n<p>2 \/ Interpr\u00e9tation des blocs \u00e0 l&#8217;aide du parser. <\/p>\n\n\n\n<p>Bloc classique : <\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"wp-block-code\"><code>&lt;Turn speaker=\"spk1\" startTime=\"403.994\" endTime=\"407.699\"&gt;\n&lt;Sync time=\"403.994\"\/&gt;\noui mais je me suis excus\u00e9 c'est bon l\u00e0\n&lt;Sync time=\"406.048\"\/&gt;\nj'ai pas fait expr\u00e8s\n&lt;\/Turn&gt;\n<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n<\/div>\n\n\n\n<p>Bloc sp\u00e9cifique : <\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"wp-block-code\"><code>&lt;Turn startTime=\"0\" endTime=\"120.852\" speaker=\"spk1\"&gt;\n&lt;Sync time=\"0\"\/&gt;\n\n&lt;Sync time=\"0.586\"\/&gt;\n\n&lt;Event desc=\"rire\" type=\"noise\" extent=\"instantaneous\"\/&gt;\n\n&lt;Sync time=\"1.409\"\/&gt;\nc'est moi\n&lt;Sync time=\"2.462\"\/&gt;\n\n&lt;Sync time=\"120.295\"\/&gt;\n\u00e7a va ?\n&lt;\/Turn&gt;\n<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>Attention aux lignes vides, lors de la recomposition du bloc, elles ne sont pas interpr\u00e9t\u00e9es par le parser. Si on reconstitue ce bloc de la mani\u00e8re suivante  &#8230;.&lt;Sync time=&#8221;0&#8243;\/&gt;&lt;Sync time=&#8221;0.586&#8243;\/&gt;&lt;Event desc=&#8221;rire&#8221; type=&#8221;noise&#8221; extent=&#8221;instantaneous&#8221;\/&gt;&#8230;<br>le parser ne distingue pas les \u00e9l\u00e9ments interm\u00e9diaires et repositionne mal les groupes de mots. D&#8217;o\u00f9 l&#8217;ajout syst\u00e9matique d&#8217;une cha\u00eene de caract\u00e8res que l&#8217;on pourra distinguer et filtrer par la suite  &#8230;.&lt;Sync time=&#8221;0&#8243;\/&gt;YS&lt;Sync time=&#8221;0.586&#8243;\/&gt;YS <\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center has-vivid-green-cyan-color has-text-color has-link-color wp-elements-63d1bc362263829e04302fefee9df323\">R\u00e9sultats de l&#8217;extraction \u00e0 partir de 511 fichiers TRS des enregistrements d&#8217;ESLO2 :<\/p>\n\n\n\n<p class=\"has-text-align-center has-vivid-green-cyan-color has-text-color has-link-color wp-elements-b03eb0f46c4783548ca4cd8bce2818d1\">62802 Blocs multi-speakers non interpr\u00e9t\u00e9s <br>338951 Documents g\u00e9n\u00e9r\u00e9s dans <span class='tooltipsall tooltipsincontent classtoolTips3'>MongoDB<\/span> pour les groupes de souffle<br>40753 entr\u00e9es diff\u00e9rentes ajout\u00e9es dans la lexique Eslo2. <\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-238e78a4de0af501db146f5d09c7ed5e\">Extraction des donn\u00e9es ESLO 1 : <\/p>\n\n\n\n<p class=\"has-text-align-center has-vivid-green-cyan-color has-text-color has-link-color wp-elements-73c18dd01b6db09cb48c2d1b1c132472\">R\u00e9sultats de l&#8217;extraction \u00e0 partir de 346 fichiers TRS des enregistrements d&#8217;ESLO1 :<\/p>\n\n\n\n<p class=\"has-text-align-center has-vivid-green-cyan-color has-text-color has-link-color wp-elements-f1359381be6307b72eee2f046376efca\">39265 Blocs multi-speakers non interpr\u00e9t\u00e9s <br>400633 Documents g\u00e9n\u00e9r\u00e9s dans <span class='tooltipsall tooltipsincontent classtoolTips3'>MongoDB<\/span> pour les groupes de souffle<br>38855 entr\u00e9es diff\u00e9rentes ajout\u00e9es dans la lexique Eslo1.<\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-0f4297f2ff06d89d9ba5be0e0e2dc8c5\">Restrictions: <\/p>\n\n\n\n<p>Nous faisons le choix dans le traitement des transcriptions de ne pas prendre en compte les blocs multi-speakers  pour \u00e9viter de la confusion et afin d&#8217;avoir des enregistrements clairs et pr\u00e9cis. <\/p>\n\n\n\n<p>Exemple de bloc multi-speakers <\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"wp-block-code\"><code>&lt;Turn speaker=\"spk5 spk1\" startTime=\"407.699\" endTime=\"410.971\"&gt;\n&lt;Sync time=\"407.699\"\/&gt;\n&lt;Who nb=\"1\"\/&gt;\nbon tu es tu es\n&lt;Event desc=\"pi\" type=\"pronounce\" extent=\"instantaneous\"\/&gt;\n parce que c'est\n&lt;Event desc=\"rire\" type=\"noise\" extent=\"instantaneous\"\/&gt;\n\n&lt;Who nb=\"2\"\/&gt;\n\n&lt;Event desc=\"rire\" type=\"noise\" extent=\"instantaneous\"\/&gt;\n\n&lt;Sync time=\"410.086\"\/&gt;\n&lt;Who nb=\"1\"\/&gt;\n\n&lt;Who nb=\"2\"\/&gt;\n\n&lt;\/Turn&gt;<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>On peut constater que dans ce d\u00e9coupage les \u00e9l\u00e9ments ne sont pas assez  pr\u00e9cis et n&#8217;apportent pas d&#8217;informations suppl\u00e9mentaires pour notre  plateforme passy, qui met en avant l&#8217;\u00e9coute et la prononciation des mots par un seul locuteur. <\/p>\n<\/div>\n<\/div>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>D\u00e9tail du code pour l&#8217;extraction <\/summary>\n<pre class=\"wp-block-code\"><code>def traite_bloc(bb,speakers,fichier):\n    \"\"\"\n    Traitement du bloc Turn pour en extraire les \u00e9l\u00e9ments \n    \"\"\"\n    global nb_speakers_multiple, liste_mots\n    tree = ET.ElementTree(ET.fromstring(bb))\n    root=tree.getroot()\n    Turn=root.attrib\n    # on regarde si plusieurs speakers \n    if \"speaker\" not in Turn:\n        print(\"pas de speaker dans le bloc\")\n        return\n    tab_speakers=Turn&#91;\"speaker\"].split(\" \")\n    D_bloc_recompose={}\n    if len(tab_speakers)&lt;2 :\n        txt_complet=\"\"\n        textes=&#91;]\n        debut=Turn&#91;\"startTime\"]\n        ref_end=Turn&#91;\"endTime\"]\n        #on parcourt les deux listes en m\u00eame temps\n        for indice,txt in zip(list(root), root.itertext()):\n            if \"time\" in indice.attrib :  #&lt;Sync time=\"407.699\"\/&gt;\n                ref_debut= indice.attrib&#91;'time']\n                if debut!=ref_debut:\n                    textes.append({\"debut\":debut, \"fin\":ref_debut,\"texte\":txt_complet.strip()})\n                    debut=ref_debut\n                txt_complet=txt\n        #pour le dernier \n        textes.append({\"debut\":debut, \"fin\":ref_end,\"texte\":txt_complet.strip()})\n        for texte in textes:\n            D_bloc_recompose={}\n            if texte&#91;\"texte\"]!=\"\" and texte&#91;\"texte\"]!=\"YS\" :\n                mot_propre=texte&#91;\"texte\"].replace(\"'\",\" \").replace(\"?\",\" \")\n                tab_res = re.split('\\s+',  mot_propre)\n                for mot in tab_res:\n                    if mot in liste_mots:\n                        liste_mots&#91;mot]+=1\n                    else:\n                        liste_mots&#91;mot]=1\n                D_bloc_recompose&#91;\"enreg\"]=fichier\n                D_bloc_recompose&#91;\"locuteur\"]=speakers&#91;Turn&#91;\"speaker\"]]&#91;\"name\"]\n                D_bloc_recompose&#91;\"texte\"]=texte&#91;\"texte\"]\n                D_bloc_recompose&#91;\"morpho\"]=&#91;{y:x} for x,y in return_POS(texte&#91;\"texte\"])]\n                D_bloc_recompose&#91;\"debut\"]=texte&#91;\"debut\"]\n                D_bloc_recompose&#91;\"fin\"]=texte&#91;\"fin\"]\n                # on enregistre la structure directement dans <span class='tooltipsall tooltipsincontent classtoolTips3'>MongoDB<\/span>\n                mycol.insert_one(D_bloc_recompose)\n    else :\n        nb_speakers_multiple+=1\n\n<\/code><\/pre>\n<\/details>\n\n\n\n<p class=\"has-vivid-green-cyan-color has-text-color has-link-color has-medium-font-size wp-elements-2cd785db3727df1facf3a60c41b902f6\">Modifications et adaptations suite r\u00e9union du 16\/12\/2025 <\/p>\n\n\n\n<p>Pour ajouter la possibilit\u00e9 d&#8217;\u00e9couter les \u00e9l\u00e9ments sonores avant et apr\u00e8s un segment il est n\u00e9cessaire de disposer de la totalit\u00e9 des segments pour tous les enregistrements ENTRETIEN d&#8217;ESLO. Ensuite de r\u00e9adapter le web service au niveau de Spring Boot pour permettre cette r\u00e9cup\u00e9ration. Pour ce faire on a impl\u00e9ment\u00e9 de nouvelles  entr\u00e9es dans l&#8217;API get_avant_ et get_apres qui s&#8217;appuient sur le type de requ\u00eate ci-dessous : <\/p>\n\n\n\n<p>db.getCollection(&#8216;eslo2&#8217;).aggregate([{&#8220;$addFields&#8221;:{nouv:{$toDouble:&#8221;$debut&#8221;}}},{$match:{$and:[{$expr:{$gt:[&#8220;$nouv&#8221;,280.261]}},{$expr:{$lt:[&#8220;$nouv&#8221;,301.261]}},{&#8220;enreg&#8221;:&#8221;ESLO2_ENT_1010_C&#8221;}]}}])\t\t<\/p>\n\n\n\n<p>On g\u00e9n\u00e8re un nouveau champ nouv pour transformer la donn\u00e9e texte en donn\u00e9e num\u00e9rique afin de pouvoir la comparer. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ chercher les segments avant et apr\u00e8s celui courant\n\/\/ on va prendre le debut -10 et la fin + 10 \n@RequestMapping(value = \"\/get_avant_\", method = POST)\n@PostMapping(\"json\")\npublic List&lt;Proposition_IA&gt; get_avant_(@RequestBody Map&lt;String, String&gt; body) {\n\tString locuteur = body.get(\"locuteur\");\n\tdouble debut= Double.parseDouble(body.get(\"debut\"));\n\tdouble fin=  Double.parseDouble(body.get(\"fin\"));\n\tString enreg=  body.get(\"enreg\");\t\t\t\n\tAddFieldsOperation Addfield = Aggregation.addFields().addField(\"nouv\").withValue(ConvertOperators.ToDouble.toDouble(\"$debut\")).build();\n\t\/\/ avant \n\tCriteria critres = new Criteria().andOperator(\n\t\tCriteria.where(\"nouv\").lt(debut),\n\t\tCriteria.where(\"nouv\").gt(debut-10),\n\t\tCriteria.where(\"enreg\").regex(enreg));\n\tMatchOperation matchStage = Aggregation.match(critres);\n\tAggregation aggregation = Aggregation.newAggregation(Addfield, matchStage);\n\tAggregationResults&lt;Proposition_IA&gt; output_avant = mongoTemplate.aggregate(aggregation, \"eslo2\", Proposition_IA.class);\n\tList&lt;Proposition_IA&gt; avant_result = output_avant.getMappedResults();\n\treturn avant_result;\n}\t<\/code><\/pre>\n\n\n\n<p>Description de la classe : propositions_IA <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private String _id;\nprivate String locuteur;\nprivate String  enreg ;\nprivate String  texte ;\nprivate ArrayList&lt;String&gt;  morpho ;\nprivate double debut ;\nprivate double fin ;\nprivate Statut statut ;<\/code><\/pre>\n\n\n\n<p>La partie Morpho a \u00e9t\u00e9 neutralis\u00e9e dans le visuel pour le moment. L&#8217;ensemble des r\u00e9sultats sont ensuite descendus au niveau du navigateur dans l&#8217;interface WEB et positionn\u00e9s dans une div autour du bouton lecture. Ce qui permet \u00e0 l&#8217;utilisateur de charger uniquement les \u00e9l\u00e9ments n\u00e9cessaires \u00e0 la compr\u00e9hension du segment lors de l&#8217;analyse.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"886\" height=\"502\" src=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-19-11-59-28.png\" alt=\"\" class=\"wp-image-11309\" srcset=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-19-11-59-28.png 886w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-19-11-59-28-300x170.png 300w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-19-11-59-28-768x435.png 768w\" sizes=\"auto, (max-width: 886px) 100vw, 886px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-vivid-green-cyan-color has-text-color has-link-color has-medium-font-size wp-elements-19dffeec55e9e4ac781cf32358a5866e\">Impl\u00e9mentation de la prise de note :<\/p>\n\n\n\n<p>Impl\u00e9mentation de la prise de note au niveau des entr\u00e9es : on souhaite \u00e9galement conserver les informations associ\u00e9es au segment, pour ce faire on a am\u00e9nag\u00e9 un syst\u00e8me de prise de note qui permet d&#8217;accompagner les chercheurs dans leur exploration et lors de leur s\u00e9lection  et  ensuite de les partager entre eux. L&#8217;acc\u00e8s en modification est autoris\u00e9 au seul propri\u00e9taire de la note. Au niveau du web service il a fallu mettre en place un syst\u00e8me de gestion de ces notes dans deux contextes: contexte lors du travail pr\u00e9paratoire BROUILLON et lors de la s\u00e9lection des entr\u00e9es VALID,  ce qui correspond \u00e0 l&#8217;onglet Corpus ESLO2 et Exemplaires de l&#8217;interface. <\/p>\n\n\n\n<p>Une collection Annotation d\u00e9di\u00e9e a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9e pour conserver ce type d&#8217;information et est reli\u00e9e par l&#8217;ID \u00e0 l&#8217;entr\u00e9e correspondante.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-vivid-green-cyan-color has-text-color has-link-color has-medium-font-size wp-elements-a16a0baac0175f32034a20dce814fab3\">Interface avec Praat\/Elan <\/p>\n\n\n\n<p>La plateforme PASSY doit permettre aux utilisateurs de travailler dans les meilleures conditions et d&#8217;offrir les fonctionnalit\u00e9s n\u00e9cessaires pour les diff\u00e9rentes phases. On a identifi\u00e9 plusieurs phases : <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>phase d&#8217;alimentation qui se concentre principalement au niveau du module de supervision et qui est d\u00e9di\u00e9e aux expert(e)s  , <\/li>\n\n\n\n<li>phase d&#8217;exploitation\/extraction qui est d\u00e9di\u00e9e \u00e0 toue les utilisateurs de la plateforme  <\/li>\n<\/ul>\n\n\n\n<p>Pour ces deux phases il semble int\u00e9ressant d&#8217;offrir des outils d&#8217;analyse de signaux sonores sur un ou plusieurs \u00e9l\u00e9ments afin d&#8217;avoir des m\u00e9canismes de comparaison et d&#8217;extraction qui reposent sur des m\u00e9triques associ\u00e9s directement au signal que l&#8217;on pourra croiser avec les m\u00e9ta-donn\u00e9es. <\/p>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-d19ed3c3b76fd8e9268fdbe4463161d5\">Interfa\u00e7age avec Praat :<\/p>\n\n\n\n<p>Praat est disponible en version desktop sur les environnements Windows, <a href=\"https:\/\/www.fon.hum.uva.nl\/praat\/download_linux.html\">Linux<\/a> et Mac. Il offre \u00e9galement des possibilit\u00e9s de <a href=\"https:\/\/www.fon.hum.uva.nl\/praat\/manual\/Scripting.html\">scripts<\/a> qui permettent d&#8217;encapsuler des traitements en lots sur des sources d\u00e9finies. De plus une des versions de Praat est disponible en mode commande. Exemples de scripts <a href=\"https:\/\/github.com\/FieldDB\/Praat-Scripts\">https:\/\/github.com\/FieldDB\/Praat-Scripts<\/a><\/p>\n\n\n\n<p>Donc le dispositif que l&#8217;on envisage avec ce type de solution est le suivant : <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>D\u00e9finir les fonctionnalit\u00e9s que l&#8217;on souhaite offrir lors des diff\u00e9rentes phases\n<ul class=\"wp-block-list\">\n<li>Phase de supervision  &#8212; pour les expert(e)s <\/li>\n\n\n\n<li>Phase d&#8217;exploitation    &#8212; pour les utilisateurs<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Traduire ces fonctionnalit\u00e9s en scripts  <\/li>\n\n\n\n<li>Tester les scripts pour la production de r\u00e9sultats  sur un ou plusieurs \u00e9l\u00e9ments sonores <\/li>\n\n\n\n<li>Tester l&#8217;int\u00e9gration et l&#8217;ex\u00e9cution de ces scripts dans un environnement en mode commandes (sans interface graphique )<\/li>\n\n\n\n<li>Int\u00e9grer dans un web service le dispositif d&#8217;appel et de restitution des r\u00e9sultats de traitements \u00e0 la plateforme Passy <\/li>\n<\/ul>\n\n\n\n<p class=\"has-pale-pink-color has-text-color has-link-color has-medium-font-size wp-elements-eb96353a1d7b2782afe57fda282a3019\">Impl\u00e9mentation et \u00e9valuation sous Python <\/p>\n\n\n\n<p>Sous python : voir le site  de  <a href=\"https:\/\/parselmouth.readthedocs.io\/en\/stable\/\">https:\/\/parselmouth.readthedocs.io\/en\/stable\/<\/a><br>Installation sous linux :  pip install praat-parselmouth<\/p>\n\n\n\n<p>Exemple de mise en oeuvre avec une extraction simple <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import parselmouth\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nMatplotlib is building the font cache; this may take a moment.\nsns.set() # Use seaborn's default style to make attractive graphs\nplt.rcParams&#91;'figure.dpi'] = 100 # Show nicely large images in this notebook\nsnd = parselmouth.Sound(\"audio\/the_north_wind_and_the_sun.wav\")\nplt.figure()\nplt.plot(snd.xs(), snd.values.T)\nplt.xlim(&#91;snd.xmin, snd.xmax])\nplt.xlabel(\"time &#91;s]\")\nplt.ylabel(\"amplitude\")\nplt.show() # or plt.savefig(\"sound.png\"), or plt.savefig(\"sound.pdf\")<\/code><\/pre>\n\n\n\n<p>Pour extraire une partie du signal et faire une repr\u00e9sentation plus fine d&#8217;une <\/p>\n\n\n\n<p>Utilisation de cette solution sous forme de web service via flask <a href=\"https:\/\/parselmouth.readthedocs.io\/en\/stable\/examples\/web_service.html\">voir<\/a><\/p>\n\n\n\n<p>D\u00e9tail de la biblioth\u00e8que : parselmouth <\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>parselmouth.AmplitudeScaling(&nbsp;)<\/td><td>&nbsp;parselmouth.PitchUnit()<\/td><td>parselmouth.SoundFileFormat()<\/td><\/tr><tr><td>parselmouth.CC(&nbsp;&nbsp;)<\/td><td>&nbsp;&nbsp;parselmouth.praat&nbsp;()<\/td><td>parselmouth.SpectralAnalysisWindowShape()<\/td><\/tr><tr><td>parselmouth.Data()<\/td><td>&nbsp;parselmouth.PraatError()<\/td><td>&nbsp;parselmouth.Spectrogram()<\/td><\/tr><tr><td>parselmouth.Formant()<\/td><td>parselmouth.PraatFatal()<\/td><td>&nbsp;parselmouth.Spectrum()<\/td><\/tr><tr><td>parselmouth.FormantUnit(<\/td><td>parselmouth.PRAAT_VERSION&nbsp;<\/td><td>parselmouth.TextGrid()<\/td><\/tr><tr><td>parselmouth.Function(&nbsp;&nbsp;)<\/td><td>parselmouth.PRAAT_VERSION_DATE<\/td><td>parselmouth.Thing(<\/td><\/tr><tr><td>parselmouth.Intensity(&nbsp; &nbsp;)<\/td><td>&nbsp;parselmouth.read(&nbsp;)<\/td><td>parselmouth.TimeFunction(<\/td><\/tr><tr><td>parselmouth.Interpolation()<\/td><td>parselmouth.Sampled(&nbsp;&nbsp;)<\/td><td>&nbsp;parselmouth.ValueInterpolation()<\/td><\/tr><tr><td>parselmouth.Matrix()<\/td><td>parselmouth.SampledXY()<\/td><td>&nbsp;parselmouth.Vector()<\/td><\/tr><tr><td>parselmouth.MFCC(&nbsp;)<\/td><td>parselmouth.SignalOutsideTimeDomain<\/td><td>parselmouth.VERSION<\/td><\/tr><tr><td>parselmouth.Pitch()<\/td><td>parselmouth.Sound(&nbsp;)<\/td><td>parselmouth.WindowShape()<br><\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Fonctions associ\u00e9es \u00e0 parselmouth.Sound()<\/p>\n\n\n<script type='text\/javascript'>\nvar id = \"11436\";<\/script>\n<script type='text\/javascript' src='https:\/\/spgoo.org\/wp-content\/uploads\/winp-css-js\/11436.js?ver=1766738561'><\/script>\n\n\n\n<p><\/p>\n\n\n\n<p>Code exemple pour le web service et int\u00e9gration dans notre contexte <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>%%writefile server.py\n\nfrom flask import Flask, request, jsonify\nimport tempfile\n\napp = Flask(__name__)\n\n@app.route('\/pitch_track', methods=&#91;'POST'])\ndef pitch_track():\n    import parselmouth\n\n    # Save the file that was sent, and read it into a parselmouth.Sound\n    with tempfile.NamedTemporaryFile() as tmp:\n        tmp.write(request.files&#91;'audio'].read())\n        sound = parselmouth.Sound(tmp.name)\n\n    # Calculate the pitch track with Parselmouth\n    pitch_track = sound.to_pitch().selected_array&#91;'frequency']\n\n    # Convert the NumPy array into a list, then encode as JSON to send back\n    return jsonify(list(pitch_track))<\/code><\/pre>\n<script type=\"text\/javascript\"> toolTips('.classtoolTips3','<a style=\"text-decoration: none;\" href=\"https:\/\/www.mongodb.com\/fr-fr\"><img style=\"width: 180px; height: 50px;\" src=\"\/wp-content\/uploads\/2025\/01\/mongodb-logo-rgb-scaled.jpg\" \/><\/a>'); <\/script>","protected":false},"excerpt":{"rendered":"<p>PASSY-DPFV &#8212; resp. Gabriel Bergounioux Appui SPGoO : Yvan Stroppa Construction d&#8217;une plateforme nomm\u00e9e Passy sur la base de la r\u00e9alisation effectu\u00e9e pour MP Tours (DeepBdd-Bddictionnairique) dans un contexte de langue fran\u00e7aise. Ce travail est r\u00e9alis\u00e9 en collaboration avec G. Bergounioux et avec la participation de l&#8217;ATILF (Nancy). Objectif : concevoir une plateforme Web d&#8217;alimentation, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5979","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/5979","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5979"}],"version-history":[{"count":96,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/5979\/revisions"}],"predecessor-version":[{"id":11456,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/5979\/revisions\/11456"}],"wp:attachment":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}