Lecture automatique TTS

Home » Lecture automatique TTS


Le conte­nu sonore du lec­teur audio ci-des­sous est une trans­crip­tion vocale réa­li­sée à l’aide du plu­gin SPEAKER (voir plus bas). Vous pou­vez écou­ter cette même page avec un lec­teur MEKS (cli­quer ce lien).

Source : OER Ser­vices

Cette page pré­sente mon choix d’un logi­ciel de lec­ture auto­ma­tique — en anglais text-to-speech, d’où le sigle « TTS ».

J’ai ins­tal­lé ce dis­po­si­tif pour faci­li­ter l’ac­cès de ce site aux per­sonnes à vision réduite, mais aus­si aux lec­trices et lec­teurs qui le fré­quentent via une tablette ou un smart­phone, plu­tôt qu’un ordi­na­teur de bureau. Les sta­tis­tiques révèlent que ce mode d’ac­cès est celui de presque la moi­tié des visi­teurs.

Avec un smart­phone, sur­tout si l’on est occu­pé à d’autres acti­vi­tés — mar­cher, conduire un véhi­cule, faire la cui­sine, etc. — il est dif­fi­cile, si ce n’est impos­sible, de lire un long texte en entier. Or, de nom­breuses per­sonnes (c’est mon cas) sont habi­tuées à l’é­coute de pod­casts d’é­mis­sions radio­pho­niques dont la durée peut dépas­ser une heure. Elles peuvent donc consa­crer le même temps à écou­ter une trans­crip­tion orale, pour­vu que celle-ci ne soit pas trop arti­fi­cielle…

De plus en plus fré­quem­ment, des auteurs de blogs dis­posent au som­met de chaque article un lec­teur audio qui per­met d’en écou­ter le conte­nu. Tou­te­fois, contrai­re­ment à eux, je n’ai pas du tout l’in­ten­tion de m’en­re­gis­trer en train de lire mes écrits, ce qui m’o­bli­ge­rait à recom­men­cer la lec­ture après chaque modi­fi­ca­tion ! Ce site est en per­pé­tuelle mise à jour, cer­tai­ne­ment une de ses prin­ci­pales qua­li­tés… J’ai donc choi­si d’es­sayer la trans­crip­tion orale auto­ma­tique, le fameux TTS qu’on peut (re)lancer d’un simple clic après un tra­vail d’é­di­tion.

J’a­vais une autre moti­va­tion à m’in­ves­tir dans ce pro­jet. Pen­dant une ving­taine d’an­nées, j’ai tra­vaillé au CNRS dans un centre de recherches en sciences de la parole — le Labo­ra­toire Parole et Lan­gage — et plus par­ti­cu­liè­re­ment avec l’é­quipe Pro­so­die de la parole diri­gée par Daniel Hirst. À l’é­poque, nous rêvions de logi­ciels TTS qui syn­thé­ti­se­raient au mieux la voix humaine, autant dans ses dimen­sions pho­né­tique et arti­cu­la­toire que dans la construc­tion de la pro­so­die : rythme, inten­si­té, into­na­tion. Les méthodes clas­siques « à par­tir de règles » ne don­naient satis­fac­tion que dans des domaines limi­tés. Or notre rêve est en par­tie deve­nu réa­li­té — à vous d’en juger ! — grâce aux tech­niques d’ap­pren­tis­sage auto­ma­tique qu’au­jourd’­hui les ingé­nieurs dési­gnent par Big Data, et les « com­mu­ni­cants » Arti­fi­cial Intel­li­gence…

En réa­li­té, il n’y a aucune intel­li­gence dans cette approche… On se contente de fabri­quer des « boîtes noires » qui feront le tra­vail, après un fas­ti­dieux entraî­ne­ment sur de grandes masses de don­nées. Mais ces boîtes noires ne peuvent pas — et ne pour­ront jamais — révé­ler leurs « secrets ». Pas plus qu’un enfant de cinq ans ne pour­rait énon­cer les règles aux­quelles il obéit intui­ti­ve­ment pour com­mu­ni­quer dans sa langue mater­nelle.

Cette tech­no­lo­gie a été ren­due pos­sible par l’ar­ri­vée de pla­te­formes infor­ma­tiques puis­santes — en rapi­di­té, en mémoire et en espace de sto­ckage — et sur­tout par l’im­mense masse de don­nées (tex­tuelles et orales) col­lec­tées par les géants du Net (Google, Ama­zon, etc.). Des dis­po­si­tifs text-to-speech sont aujourd’­hui dis­po­nibles pour un grand nombre de langues, avec des voix de plus en plus proches de celles de locu­teurs humains — voir la liste de Google et faire un essai.

J’ai donc déci­dé de ten­ter l’ex­pé­rience, tout en gar­dant en tête l’i­dée que ce dis­po­si­tif n’est pas sup­po­sé rem­pla­cer une lec­ture humaine, mais sim­ple­ment offrir un nou­veau mode d’ac­cès au conte­nu de ce site. Le défi étant que, plus la trans­crip­tion se rap­proche de la lec­ture humaine, plus on en repère les défauts !

Le pari était ris­qué, mais il s’est avé­ré judi­cieux : en un mois, la fré­quen­ta­tion du site et le nombre d’ar­ticles consul­tés ont été mul­ti­pliés par quatre.

Sur­tout, j’ai décou­vert qu’il était facile d’a­mé­lio­rer le ren­du vocal des trans­crip­tions en pro­gram­mant des règles (voir ci-des­sous). Retour, donc, à la vieille école des gram­maires for­melles ! 😀

Seule ombre au tableau : l’ab­sence d’ac­cents régio­naux, ou plu­tôt la domi­na­tion de celui des sujets dont les paroles ont été incluses au cor­pus d’ap­pren­tis­sage — voir article. Navré pour mes col­lègues socio­lin­guistes ! Le seul accent fran­çais « dif­fé­rent » sur Google Cloud est celui, uni­for­mi­sé lui aus­si, de locu­teurs du « fran­çais cana­dien » (fr-CA). On constate d’ailleurs que, dans notre monde glo­ba­li­sé, la notion d’ac­cent se réduit à la seule com­bi­nai­son d’une langue et d’un pays…

La suite de cette page s’a­dresse aux édi­teurs de sites Word­Press fran­co­phones qui sou­haitent se lan­cer dans la même aven­ture. J’y par­tage mon expé­rience afin de leur faci­li­ter la tâche.

Premiers essais de plugins TTS

J’a­vais pris connais­sance de quelques logi­ciels TTS sur des articles com­pa­ra­tifs (en anglais). Leurs des­crip­tions en étaient mal­heu­reu­se­ment super­fi­cielles, visi­ble­ment rédi­gées par des infor­ma­ti­ciens qui n’a­vaient pas pris le temps de les éva­luer sur des don­nées réelles.

Il faut savoir que la trans­crip­tion orale, pro­pre­ment dite, est presque tou­jours effec­tuée sur les grandes pla­te­formes : Google Cloud, Ama­zon Web Ser­vices, Micro­soft Azure, et peut-être d’autres. Le résul­tat sera donc qua­si­ment iden­tique quel que soit le plu­gin ins­tal­lé sur le site Word­Press. Seuls quatre cri­tères per­mettent d’exer­cer un choix adap­té aux besoins (et au bud­get) :

  1. Le prix du plu­gin
  2. L’in­ter­face d’é­di­tion
  3. L’in­ter­face du lec­teur audio
  4. Le pré-trai­te­ment des don­nées tex­tuelles

Je ne décri­rai que des plu­gins cou­plés à Google Cloud. La bonne nou­velle est que la trans­crip­tion orale via Google Cloud est gra­tuite dans des quan­ti­tés rai­son­nables — voir tarif. Avec un simple compte Google Cloud, on peut trans­crire chaque mois, sans rien dépen­ser, un nombre appré­ciable de carac­tères.

J’u­ti­lise de pré­fé­rence les voix les plus raf­fi­nées : celles des caté­go­ries « Neural2″ et « Wave­net », pour les­quelles la pla­te­forme traite gra­tui­te­ment jus­qu’à 1 mil­lion de carac­tères par mois. Au-delà de ce quo­ta, comp­ter 16 dol­lars par tranche sup­plé­men­taire de 1 mil­lion de carac­tères. Ce sur­coût est quatre fois moins éle­vé pour les voix stan­dard, mais leur ren­du sonore (en fran­çais) est fran­che­ment moins bon. Les tarifs sont qua­si­ment iden­tiques sur Ama­zon Pol­ly.

Les pla­te­formes pro­posent aus­si, moyen­nant finances, de créer une brand voice, autre­ment dit une voix ayant toutes les carac­té­ris­tiques d’une voix exis­tante prise pour modèle. Il est à craindre que les imper­fec­tions soient encore plus audibles dans ce cas !

Quelle que soit la voix choi­sie, le contour pro­so­dique est médiocre sur les phrases très longues. Il peut même conduire à un esca­mo­tage de syl­labes, voire une pro­non­cia­tion incom­pré­hen­sible si l’on s’obs­tine à faire de trop longues phrases. Uti­li­ser une ponc­tua­tion abon­dante : ne pas éco­no­mi­ser les vir­gules, ne pas essayer de lire du Proust !  😀

Le véri­table cri­tère à prendre en compte pour la via­bi­li­té d’un TTS est le prix du plu­gin. Soit le ven­deur demande un règle­ment une fois pour toutes, soit il faut pas­ser par un abon­ne­ment men­suel ou annuel, auquel cas le plu­gin peut aus­si limi­ter le nombre de textes ou de carac­tères trans­crits.

Pour ne pas vous faire plus attendre, je peux révé­ler que j’ai dépen­sé, en tout et pour tout, 29 euros pour la mise en place du plu­gin SPEAKER sur ce site (en décembre 2022). Bien enten­du, la fac­ture de Google Cloud est en pro­por­tion du volume de texte conver­ti, étant don­nés les innom­brables essais qu’il m’a fal­lu faire pour en affi­ner les règles… Il est donc pru­dent, sur­tout au début, de gar­der un œil sur la fac­tu­ra­tion (billing) de son compte Google Cloud.

Voi­ci pour com­men­cer les deux plu­gins que j’ai essayés en situa­tion réelle, mais pas adop­tés. Ils peuvent s’a­vé­rer pré­fé­ren­tiels dans d’autres envi­ron­ne­ments.

Trinity Audio

Ce plu­gin (voir télé­char­ge­ment) fonc­tionne en ver­sion gra­tuite, mais avec une contrainte sévère sur le nombre d’ar­ticles ou pages conver­ties chaque mois : seule­ment 5 (voir les prix des dif­fé­rentes offres). Cette ver­sion gra­tuite ne sert pra­ti­que­ment qu’à titre d’es­sai.

Je suis donc immé­dia­te­ment pas­sé à l’offre BASIC fac­tu­rée 15 dol­lars par mois. Mau­vaise sur­prise : l’in­ter­face (fin 2022) ne per­met­tait pas un ver­se­ment men­suel. J’ai donc dû m’ac­quit­ter de 189 dol­lars pour un abon­ne­ment annuel. Somme qui m’a heu­reu­se­ment été rem­bour­sée sans dif­fi­cul­té quand j’ai renon­cé à cette solu­tion — par appli­ca­tion de la garan­tie de rem­bour­se­ment à 30 jours.

Avec l’offre BASIC, j’ai pu conver­tir un plus grand nombre d’ar­ticles, la limite étant de 30 par mois. Tou­te­fois, après 5 modi­fi­ca­tions, toute modi­fi­ca­tion de l’ar­ticle est comp­tée comme un nou­vel article. Autre­ment dit, pour un même article sur lequel j’a­vais effec­tué 9 modi­fi­ca­tions, j’é­tais taxé de « 5 articles ». On com­prend ici que même l’offre BASIC ne convient pas aux sites dont les conte­nus sont régu­liè­re­ment mis à jour. Chaque fois que je relis un de mes textes, j’ai ten­dance à en cor­ri­ger le conte­nu — car je suis un médiocre rédac­teur. Pour un bon ren­du sonore, des cor­rec­tions signi­fi­ca­tives peuvent se limi­ter à ajou­ter une vir­gule à un endroit par­ti­cu­lier, afin de déli­mi­ter les uni­tés de souffle qui gou­vernent le contour pro­so­dique.

L’offre BASIC donne accès à un autre dis­po­si­tif appe­lé « lexique » (lexi­con). Ce sont de simples règles de réécri­ture appli­quées à des mots ou des expres­sions. Un très grand avan­tage du lexique de Tri­ni­ty Audio est la pos­si­bi­li­té d’en­trer des carac­tères pho­né­tiques (alpha­bet IPA) et d’af­fi­ner ain­si la pro­non­cia­tion de mots étran­gers sans chan­ger de langue. Tou­te­fois, ce lexique étant limi­té à 5 mots sur l’offre BASIC, ce n’est rien d’autre qu’un pro­duit d’ap­pel pour l’offre (appe­lée STANDARD) qui coûte 849 dol­lars par an… À ce prix, l’u­ti­li­sa­tion du lexique est illi­mi­tée, mais la contrainte reste de 200 articles (ou modi­fi­ca­tions) par mois.

Le lec­teur de Tri­ni­ty Audio. C’est une simple image !

Un avan­tage de Tri­ni­ty Audio sur les autres solu­tions décrites ci-des­sous est le desi­gn de son lec­teur — voir image ci-des­sus. Il com­prend (en haut à droite) deux bou­tons qui per­mettent d’a­van­cer ou de recu­ler de 10 secondes. D’autre part, on peut en option ajou­ter un lec­teur « flot­tant » qui reste posi­tion­né dans la marge gauche de la page, même pen­dant son défi­le­ment. Cette solu­tion est idéale pour la lec­ture sur les petits écrans des smart­phones, et glo­ba­le­ment bien adap­tée à une lec­ture de texte (plu­tôt qu’une écoute musi­cale).

Noter aus­si, en haut à droite (à peine visible) un bou­ton qui per­met le choix de la vitesse de lec­ture. Cette fonc­tion très utile existe sur tous les dis­po­si­tifs TTS.

Par contre, le posi­tion­ne­ment sur la page du lec­teur audio n’est pas facile : soit au som­met, soit au bas de l’ar­ticle, soit encore l’op­tion d’un lec­teur javas­cript qui néces­site de copier un code dans les champs per­son­na­li­sés (cus­to­mi­zed fields) de l’ar­ticle, puis de pla­cer un short­code dans un bloc HTML à l’emplacement du lec­teur. Sur un site Word­Press, cette solu­tion ne fonc­tionne qu’a­vec une exten­sion (par exemple Code Embed) per­met­tant d’in­sé­rer du javas­cript dans le conte­nu tex­tuel des articles… Tout cela est labo­rieux à mettre en œuvre, et peut-être même une porte ouverte à des failles de sécu­ri­té.

Non­obs­tant les limi­ta­tions que j’ai expo­sées, Tri­ni­ty Audio est une bonne solu­tion si le bud­get l’au­to­rise. J’ai lon­gue­ment dia­lo­gué avec leur équipe tech­nique qui s’est mon­trée aus­si effi­cace que bien­veillante, m’au­to­ri­sant même des dépas­se­ments de quo­tas pour effec­tuer des essais. Loca­li­sée en Ukraine, cette équipe mérite d’être sou­te­nue pour la pour­suite de ses acti­vi­tés dans des condi­tions par­ti­cu­liè­re­ment dif­fi­ciles.

BeyondWords

Cette solu­tion (voir télé­char­ge­ment) se pré­sente sous trois tarifs : le plan PILOT (gra­tuit), le plan PRO (89 dol­lars par mois) et le plan ENTERPRISE (tarif non pré­ci­sé). Je n’ai essayé que la ver­sion gra­tuite qui auto­rise 10 000 carac­tères par mois, ce qui peut paraître limi­té, sauf que les modi­fi­ca­tions ne sont pas déduites du quo­ta tant que le nombre de para­graphes de l’ar­ticle n’est pas aug­men­té. Ce plan gra­tuit est donc viable sous réserve de désac­ti­ver la mise à jour auto­ma­tique de la conver­sion pen­dant qu’on édite le texte.

Le lec­teur de Beyond­Words. C’est une simple image !

Le lec­teur audio (voir image ci-des­sus) est très facile à posi­tion­ner n’im­porte où sur la page. Il peut être lar­ge­ment modi­fié en uti­li­sant les codes CSS. (Je l’a­vais ici colo­rié en jaune.) Un point qui me paraît inté­res­sant est sa très faible hau­teur. Il com­prend aus­si (à peine visible, en bas à gauche) un bou­ton pour le choix de la vitesse de lec­ture.

Dès la solu­tion gra­tuite, Beyond­Words donne accès à une sorte de lexique (aliases) illi­mi­té. Par exemple, j’ai pro­gram­mé le rem­pla­ce­ment auto­ma­tique de « et al » par « et col­lègues », car c’est ain­si qu’un lec­teur aver­ti inter­prè­te­rait cette expres­sion. Par contre, ces alias ne recon­naissent pas l’al­pha­bet pho­né­tique. Pour pro­non­cer « Ame­ri­can Stroke Asso­cia­tion », par exemple, il faut bri­co­ler un alias du style « Ame­ri­can Stroke Asso­ciey­sheun » au lieu de « əˈmɛrəkən stroʊk əˌsoʊ­siˈeɪʃən » en IPA (voir le conver­tis­seur)…

On peut, par défaut, choi­sir une voix pour lire les titres et une autre pour les para­graphes ordi­naires. Toutes ces voix sont dési­gnées par des pré­noms.

Une option carac­té­ris­tique de Beyond­Words consiste à déso­li­da­ri­ser (désyn­chro­ni­ser) le texte d’o­ri­gine de celui qui doit être lu, ce qui per­met des cor­rec­tions de pro­non­cia­tion (en plus de celles des alias) mais aus­si l’é­di­tion d’un texte lu aus­si dif­fé­rent qu’on le sou­haite du texte écrit. C’est actuel­le­ment le seul moyen, en fran­çais, de cor­ri­ger les liai­sons. Bien enten­du, toute modi­fi­ca­tion du texte écrit devra être repro­duite (manuel­le­ment) sur le texte lu.

Le nombre de voix (et de langues) est impres­sion­nant, puisque ce logi­ciel per­met d’ac­cé­der aux res­sources des trois pla­te­formes Google Cloud, Ama­zon Web Ser­vices, Micro­soft Azure, ain­si qu’à des voix (uni­que­ment en anglais) spé­ci­fi­que­ment déve­lop­pées par Beyond­Words.

J’ai cor­res­pon­du avec l’é­quipe très sym­pa­thique de Beyond­Words pour leur sug­gé­rer quelques cor­rec­tions et amé­lio­ra­tions. Ils m’ont notam­ment signa­lé qu’ils allaient révi­ser le desi­gn de leur lec­teur audio pour répondre à des besoins tels que la ver­sion « flot­tante » que j’a­vais beau­coup appré­ciée sur Tri­ni­ty Audio.

L’é­quipe de Beyond­Words com­prend des ingé­nieurs et des lin­guistes infor­ma­ti­ciens de Google, d’Apple et du Centre de recherche sur les tech­no­lo­gies de la parole d’E­dim­bourg au Royaume-Uni.

Même dans sa ver­sion gra­tuite, Beyond­Words est une solu­tion qui per­met d’ob­te­nir un bon ren­du vocal sans faire appel à des mani­pu­la­tions infor­ma­tiques com­plexes. Cepen­dant, comme Tri­ni­ty Audio, elle n’est opti­mi­sée que pour la publi­ca­tion et la trans­crip­tion orale de textes qui ne sont pas des­ti­nés à rece­voir de fré­quentes modi­fi­ca­tions.

Remarque

Je n’ai pas conser­vé les ins­tal­la­tions de Tri­ni­ty Audio et Beyond­Words, ce qui fait que cer­tains amé­na­ge­ments que j’ai effec­tués sur SPEAKER (voir ci-des­sous) auraient pu aus­si résoudre quelques pro­blèmes sur ces solu­tions. Mer­ci de me faire part de votre expé­rience !

SPEAKER

Ma moti­va­tion prin­ci­pale pour essayer (puis adop­ter) SPEAKER — voir télé­char­ge­ment et des­crip­tion détaillée en anglais — était que c’est le seul dis­po­si­tif à ce jour (début 2023) qui gère (une par­tie du) bali­sage SSML (Speech Syn­the­sis Mar­kup Lan­guage). Le codage de ces balises par SPEAKER est (incom­plè­te­ment) pré­sen­té sur cette page.

Plateforme de conversion TTS

SPEAKER uti­lise la pla­te­forme Google Cloud pour créer les fichiers audio. À l’in­verse de ses concur­rents, il n’im­pose aucune limi­ta­tion au nombre de textes conver­tis. Concrè­te­ment, l’u­ti­li­sa­teur (le web­mas­ter) doit uti­li­ser son propre compte Google Cloud et s’ac­quit­ter direc­te­ment sur ce compte, le cas échéant, des frais de dépas­se­ment du quo­ta men­suel.

L’ins­tal­la­tion de SPEAKER néces­site le règle­ment, une fois pour toutes, d’un droit d’u­ti­li­sa­tion (29 euros fin 2022) à la socié­té Code­Ca­nyon. C’est donc de loin la solu­tion la plus éco­no­mique, et pro­ba­ble­ment — nous allons le mon­trer — la plus puis­sante pour un infor­ma­ti­cien.

La par­tie labo­rieuse de cette ins­tal­la­tion est la mise en connexion du plu­gin SPEAKER avec le compte Google Cloud qui sera uti­li­sé pour les conver­sions. Les habi­tués de Google s’y retrou­ve­ront mieux que moi ! Tout est docu­men­té en détail — en anglais, ça com­mence ici et ça conti­nue ici.

Le traitement

Sché­ma­ti­que­ment, le trai­te­ment se résume ain­si : quand on clique le bou­ton Create audio (ou Re-create audio), SPEAKER lit le conte­nu de la page ou de l’ar­ticle tels qu’ils appa­raissent à l’af­fi­chage — détail impor­tant, comme nous le ver­rons ci-des­sous.

SPEAKER applique ensuite des règles de réécri­ture (voir ci-des­sous) pro­gram­mées (en option) par l’u­ti­li­sa­teur. Il découpe enfin le texte en frag­ments (maxi­mum 4500 carac­tères) envoyés à Google Cloud pour la conver­sion sonore. Cette taille un peu supé­rieure à 4500 carac­tères est une limite incon­tour­nable du ser­vice Google Cloud.

Les fichiers sonores (au for­mat MP3) retour­nés par Google sont alors sto­ckés dans un réper­toire appro­prié. En fin de conver­sion, le plu­gin colle ensemble ces fichiers tem­po­raires pour fabri­quer un seul fichier MP3 qui sera uti­li­sé à l’au­di­tion.

Stockage des fichiers sonores

Plu­sieurs options sont pro­po­sées pour le sto­ckage des fichiers MP3 : soit dans un réper­toire du site Word­Press /wp-content/u­pload­s/s­pea­ker/, soit dans un espace de Google Cloud. La seconde solu­tion (que je n’ai pas su implé­men­ter) peut entraî­ner une fac­tu­ra­tion sup­plé­men­taire. Elle a peut-être comme avan­tage un accès plus rapide aux fichiers lors de la lec­ture (à véri­fier).

Lors­qu’on opte pour l’hé­ber­ge­ment des fichiers MP3 sur le site Word­Press, on peut deman­der d’af­fi­cher les fichiers sonores dans le dos­sier « médias », ce qui peut être utile si l’on uti­lise un plu­gin dif­fé­rent pour affi­cher le lec­teur audio — bien que la construc­tion de ces URL soit très facile.

Dans tous les cas, aucun ser­vice n’est fac­tu­ré pour la lec­ture des fichiers sonores. Cette lec­ture n’im­plique pas Google Cloud. Autre­ment dit, le prix de la sono­ri­sa­tion du site ne dépend pas de sa fré­quen­ta­tion. C’est un point à véri­fier avant de se lan­cer dans toute autre solu­tion.

Les lecteurs audio

Le posi­tion­ne­ment du lec­teur n’im­porte où sur la page (avec l’op­tion de desi­gn « short­code ») est simple, puis­qu’il se résume à ins­crire le short­code [@speaker] dans un bloc HTML per­son­na­li­sé (sous Word­Press). Sup­pri­mer le carac­tère ‘@’ uti­li­sé ici pour empê­cher l’af­fi­chage du lec­teur sur cette page…

➡ Je n’ai pas essayé les options de posi­tion « before title », « top fixed » etc. car en sélec­tion­nant « before title » le site s’est blo­qué (error 503), ce qui m’a obli­gé à désac­ti­ver bru­ta­le­ment SPEAKER via un accès FTP !

Plu­sieurs options sont pro­po­sées pour le desi­gn du lec­teur audio : soit un lec­teur Chrome, soit le lec­teur spé­ci­fique du navi­ga­teur, soit le lec­teur par défaut de Word­Press, soit enfin des lec­teurs « rond », « arron­di » ou « rec­tan­gu­laire ». On peut ensuite en amé­lio­rer l’as­pect en jouant sur les classes CSS, et insé­rer du code HTML avant ou après le lec­teur. Le lec­teur Chrome est celui qui appa­raît en haut de cette page, quel que soit votre navi­ga­teur.

Dans le short­code, on peut uti­li­ser une syn­taxe plus com­plète : [@speaker id=nnnn] (tou­jours sans le carac­tère ‘@’) dans laquelle « nnnn » est le numé­ro de la page ou de l’ar­ticle concer­né. Ce qui per­met d’af­fi­cher sur une page un lec­teur lisant le texte d’une page dif­fé­rente. Très pra­tique si l’on envi­sage d’é­di­ter un texte pour la lec­ture dis­tinct de sa ver­sion écrite, comme avec Beyond­Words. Dans ce cas, le texte des­ti­né à la lec­ture pour­ra être édi­té sur une page pri­vée, invi­sible sur le site, et ren­due publique uni­que­ment le temps de géné­rer sa trans­crip­tion orale. Cette solu­tion est meilleure que celle pré­cé­dem­ment men­tion­née pour Beyond­Words, car elle ne repose que sur des res­sources (tex­tuelles et sonores) locales.

Rien n’in­ter­dit d’é­di­ter par la suite le fichier sonore en lui ajou­tant, par exemple, de la musique.

De manière géné­rale, si les fichiers sont sto­ckés dans le réper­toire /wp-content/uploads/speaker/, un simple lien suf­fit pour accé­der au conte­nu sonore. Par exemple, le lien https://lebonheurestpossible.org/wp-content/uploads/speaker/post-35807.mp3 per­met d’é­cou­ter la trans­crip­tion de cette page (iden­ti­fiant 35807). Ce même lien per­met d’in­sé­rer un lec­teur audio stan­dard HTML 5 don­nant le même accès :

Lec­teur audio au for­mat HTML5 (par défaut sur ce navi­ga­teur)

De plus, il est pos­sible d’u­ti­li­ser des lec­teurs plus sophis­ti­qués, géné­rés par des plu­gins de Word­Press, puisque le seul para­mètre à intro­duire est l’URL du fichier sonore, facile à déter­mi­ner pour n’im­porte quel article ou page. J’ai trou­vé (et adop­té) un lec­teur « col­lant » (sti­cky) avec l’ex­ten­sion gra­tuite Meks Audio Player (voir télé­char­ge­ment) qui se posi­tionne auto­ma­ti­que­ment au bas de la fenêtre. Dans ce cas, les lec­teurs SPEAKER peuvent être sup­pri­més. Voir par exemple un article de ce site, ou écou­ter cette page avec le lec­teur MEKS.

On appré­cie­ra que le lec­teur MEKS auto­rise des sauts en avant, et en arrière, de 15 secondes, comme c’é­tait le cas de celui de Tri­ni­ty Audio. Ses seuls défauts actuels sont sa hau­teur exces­sive, et le nombre réduit de para­mètres per­met­tant de modi­fier son aspect.

Pré-traitement du texte

Des short­codes sont pro­po­sés par SPEAKER pour rendre inau­dibles cer­tains pas­sages du texte, comme par exemple des légendes de figures ou des réfé­rences biblio­gra­phiques en fin d’ar­ticle. Les mêmes effets peuvent être pro­duits, et donc auto­ma­ti­sés, par les règles de réécri­ture.

SPEAKER n’u­ti­lise pas un lexique ni des alias, mais il per­met d’in­tro­duire un nombre illi­mi­té de règles (RegEx repla­ce­ments) obéis­sant à une syn­taxe (expres­sions régu­lières) que les pro­gram­meurs uti­lisent cou­ram­ment dans des fonc­tions comme preg_replace() du lan­gage de pro­gram­ma­tion PHP, ou encore pour gérer la redi­rec­tion de connexions dans les fichiers htac­cess des ser­veurs HTTP Apache.

L’u­ti­li­sa­tion effi­cace de SPEAKER exige donc une par­faite maî­trise de la syn­taxe des expres­sions régu­lières. Il suf­fit qu’une règle soit mal for­mée pour que la conver­sion échoue, avec une redou­table alerte : « error 3 » !

Par exemple, les voix fran­co­phones de SPEAKER pro­noncent incor­rec­te­ment le nom de « Jeanne Calment » en disant « Cal­min ». Pour cor­ri­ger ce défaut, on peut intro­duire la règle sui­vante :

/Calment/
calmant

Un mot, ou une suite de mots, peuvent aus­si être recon­nus et rem­pla­cés par d’autres suites de mots, par exemple :

/TLF/
dictionnaire « trésor de la langue française »

/整体/
terme japonais

/\s=>\s/
 implique 

Des règles plus com­plexes et leurs astuces tech­niques sont expli­quées ci-des­sous.

Traitement par lot

Le trai­te­ment par lot (en anglais batch pro­ces­sing) est une fonc­tion très puis­sante de SPEAKER. Une fois que les règles de réécri­ture ont été com­plé­tées et cor­ri­gées, il peut être néces­saire de relan­cer la conver­sion de tous les articles (ou d’une sélec­tion d’ar­ticles) du site, sans devoir les ouvrir un par un en mode édi­tion…

Pour cela, il suf­fit d’af­fi­cher la liste des pages ou articles, de sélec­tion­ner les­quels doivent être trai­tés, puis de sélec­tion­ner « Create audio » dans « Actions grou­pées ».

➡ Atten­tion tou­te­fois au risque d’ex­plo­sion de la fac­ture Google Cloud ! Pour cette rai­son, les trans­crip­tions vocales de ce site ne sont pas toutes mises à jour après chaque modi­fi­ca­tion des règles ou des para­mètres.

Gabarits (templates)

Les gaba­rits (tem­plates) servent, dans SPEAKER, à exploi­ter les Cus­tom Post Types des récentes ver­sions de Word­Press. Ce déve­lop­pe­ment est en accord avec les plus récentes méthodes de construc­tion des sites. Suivre les ins­truc­tions de cette page.

Une équipe très sympa

J’en­tre­tiens une cor­res­pon­dance régu­lière avec l’é­quipe tech­nique de SPEAKER — elle aus­si loca­li­sée à Kiev — tan­tôt via leur forum d’en­traide, tan­tôt par mes­sa­ge­rie élec­tro­nique.

J’ai modi­fié leur plu­gin (ver­sions 3.4.2 à 4.0.13) pour contour­ner quelques pro­blèmes expli­qués ci-des­sous, puis je leur ai envoyé une liste de sug­ges­tions (voir copie). Leurs réponses ont été cor­diales et construc­tives, par­fois avec quelques jours de retard, étant don­née la situa­tion.

Je suis sur le point d’ins­tal­ler la ver­sion sui­vante (4.0.4) et met­trai à jour cette page en consé­quence.

Pour les geeks…

Ce qui suit est des­ti­né aux web­mas­ters sou­hai­tant ins­tal­ler la solu­tion SPEAKER sur un site Word­Press fran­co­phone. Loin de cou­vrir toutes les options, je m’en tiens aux points dont la com­pré­hen­sion m’a deman­dé quelques jour­nées de tra­vail, en l’ab­sence d’une docu­men­ta­tion détaillée.

Les lec­teurs anglo­phones habi­tués à l’in­for­ma­tique peuvent consul­ter le rap­port que j’ai fait par­ve­nir à l’é­quipe tech­nique en jan­vier 2023. En fin de rap­port, les annonces encou­ra­geantes de l’é­quipe.

Choix d’une voix ou d’une langue

Sur SPEAKER, on choi­sit une voix et une langue par défaut. Il est ensuite pos­sible d’en chan­ger au cours de l’ar­ticle ou de la page, en uti­li­sant des ins­truc­tions SSML (voir ci-des­sous). Voir, par exemple, un chan­ge­ment de voix dans l’ar­ticle Mon magni­fique mari.

En fran­çais, sur­tout pour les voix mas­cu­lines, il est pré­fé­rable d’u­ti­li­ser celles de la série Neural2 , ou en second choix Wave­net. Pour des rai­sons inex­pli­quées, la trans­crip­tion vocale d’un texte avec une voix Neural2 peut échouer (« error 3 »). Dans ce cas, il suf­fit de se rabattre sur une voix Wave­net. Dans ce cas, je pré­fère une voix fémi­nine.

Les voix que j’ai adop­tées en stan­dard sur ce site sont :

  • Voix par défaut (mas­cu­line) : fr-FR-Neu­ral2‑D réglée à la vitesse 1.2
  • Cita­tions (fémi­nine) : fr-FR-Wave­net‑C à vitesse nor­male
  • Voix lorsque « error 3 » (fémi­nine) : fr-FR-Wave­net‑E
  • Voix lorsque « error 3 » (mas­cu­line) : fr-FR-Wave­net‑D

Les voix en d’autres langues sont lis­tées ci-des­sous.

Bien enten­du, ces choix pour­ront être révi­sés lorsque de nou­velles voix seront dis­po­nibles sur Google Cloud.

Pour chaque voix, on peut choi­sir un Audio Pro­file qui per­met d’op­ti­mi­ser le ren­du en fonc­tion des condi­tions d’é­coute : montre connec­tée, télé­phone por­table, casque audio, petit haut-par­leur, grand haut-par­leur, chaîne HiFi, haut-par­leur d’au­to­mo­bile, inter­ac­tive voice res­ponse (?). J’ai opté pour « télé­phone por­table » sur ce site.

Positionnement du lecteur audio SPEAKER

Le thème uti­li­sé sur le pré­sent site impose quelques contraintes si l’on uti­lise un lec­teur audio (player) posi­tion­né dans le texte, comme c’est le cas avec celui de SPEAKER. Notam­ment, pour que l’i­mage mise en exergue soit cor­rec­te­ment posi­tion­née sur la plu­part des articles, on ne doit pas dis­po­ser le lec­teur audio plus haut qu’un cer­tain nombre de para­graphes. Par contre, le lec­teur pour smart­phone doit être pla­cé le plus haut pos­sible, mais tou­jours après le deuxième para­graphe.

Des lec­teurs « flot­tants » comme celui de Tri­ni­ty Audio, ou « col­lants » (sti­cky) comme celui de MEKS, sont donc bien mieux adap­tés à la lec­ture sur smart­phone. Ce qui suit ne concerne que les lec­teurs posi­tion­nés dans le texte.

Pour assu­rer un posi­tion­ne­ment dis­tinct de deux lec­teurs, il suf­fit d’u­ti­li­ser des classes CSS, par exemple :

.desktop {
	display: initial;
	}
.mobile {
	display: none;
	}

@media only screen and (hover: none) and (pointer: coarse) {
.desktop {
	display: none !important;
	}
.mobile {
	display: initial !important;
	}
}

Puis on ins­crit chaque lec­teur dans un « div » atta­ché à la classe cor­res­pon­dants, par exemple :

<div class="desktop">[@speaker]</div>

<div class="mobile">[@speaker]</div>

(Supprimer les caractères ‘@’)

Utilisation de wp-Typography

Cet excellent cor­rec­teur de typo­gra­phie (voir télé­char­ge­ment) pro­duit des codes qui affectent à plu­sieurs niveaux le fonc­tion­ne­ment de SPEAKER (ver­sion 4.0.13).

En pre­mier lieu, l’af­fi­chage du lec­teur : le cor­rec­teur rem­place les guille­mets droits par des guille­mets typo­gra­phiques, il ajoute des espaces insé­cables avant cer­tains signes de ponc­tua­tion, et il insère des sym­boles invi­sibles de césure (soft hyphens) qui brouillent le code.

En ce qui concerne l’af­fi­chage des lec­teurs, une solu­tion effi­cace consiste à exclure la classe CSS « mdp-spea­ker-wrap­per » du trai­te­ment par wp-Typo­gra­phy. Pour cela, dans les réglages géné­raux de wp-Typo­gra­phy, ins­crire « mdp-spea­ker-wrap­per » dans le champ Igno­rer les classes CSS.

D’autres pro­blèmes liés à wp-Typo­gra­phy condi­tionnent la pro­gram­ma­tion des règles de réécri­ture — voir ci-des­sous.

Suivi du processus

J’ai sou­vent été confron­té à l’im­pres­sion désa­gréable que des règles de réécri­ture (RegEx repla­ce­ments) ne fonc­tion­naient pas, ou encore que la trans­crip­tion orale échouait pour une rai­son incon­nue.

Il est pos­sible de suivre glo­ba­le­ment la pro­ces­sus en se connec­tant sous FTP au réper­toire /wp-content/u­pload­s/s­pea­ker/. Pen­dant la trans­for­ma­tion, on voit appa­raître les fichiers MP3 en pro­ve­nance de Google Cloud, par exemple :

tmp-f6g4ssr3q-post-35807.mp3
tmp-qz9j23mnk-post-35807.mp3
etc.

pour un article ou une page dont l’i­den­ti­fiant serait « 35807 ».

Si le pro­ces­sus arrive à son terme, ces fichiers tem­po­raires dis­pa­raissent et sont rem­pla­cés par un unique fichier : post-35807.mp3.

Ce qui est invi­sible, c’est la séquence de textes envoyés à Google Cloud ain­si que, en amont, les textes juste après leur trans­for­ma­tion par les règles de réécri­ture. J’ai donc ajou­té des ins­truc­tions dans SpeakerCaster.php pour créer un fichier post-35807.html qui contient ces frag­ments de textes. Suivre cc lien pour affi­cher la trace de la trans­crip­tion vocale de cette page :
https://lebonheurestpossible.org/wp-content/uploads/speaker/post-35807.html

Une autre ins­truc­tion détruit tous les tmp-*.* avant le lan­ce­ment d’une nou­velle conver­sion.

Cette trace m’a per­mis en pre­mier lieu de véri­fier les réécri­tures. Par exemple, de m’a­per­ce­voir que la règle (voir ci-des­sus) cor­ri­geant la pro­non­cia­tion de « Calment » n’é­tait jamais appli­quée. La rai­son est que le mot sou­mis aux règles de réécri­ture n’é­tait pas « Calment » mais « Cal&shy ;ment », car il a été cou­pé par un soft hyphen. La règle était donc deve­nue :

/Cal.{0,5}ment/
calmant

Il faut bien connaître les expres­sions régu­lières pour com­prendre que « .{0,5} » repré­sente une séquence arbi­traire de carac­tères de lon­gueur 0 à 5, cou­vrant les deux cas : avec ou sans « &shy ; ».

Cette solu­tion est un très mau­vais bri­co­lage, car la séquence « .{0,5} » peut conte­nir n’im­porte quoi. Je montre plus loin com­ment éli­mi­ner les soft hyphens une fois pour toutes.

De manière géné­rale, l’in­té­rêt du fichier post-*.html est de faire appa­raître le texte tel qu’il sera inter­pré­té par le conver­tis­seur text-to-speech.

Si le pro­ces­sus s’ar­rête — ce qui est géné­ra­le­ment signa­lé par une énig­ma­tique « erreur 3 » — on peut voir à la fin de ce fichier quel frag­ment de texte a pro­vo­qué cette erreur, et sou­vent la cor­ri­ger.

Erreur 503

Le plu­gin émet une énig­ma­tique alerte « error 503 » après envi­ron une minute de trai­te­ment. Celle-ci appa­raît sur des textes rela­ti­ve­ment longs mais ne cor­res­pond à rien de signi­fi­ca­tif : le pro­ces­sus conti­nue même si on ne clique pas le bou­ton « OK ». Je l’ai donc signa­lée comme un bug.

Time-out

Comme indi­qué dans ma note, il semble que la ses­sion d’é­changes entre le site (via SPEAKER) et Google Cloud soit limi­tée à envi­ron 3 minutes. Pour cette rai­son, le pro­ces­sus n’est pas ache­vé si les fichiers MP3 sont trop nom­breux. J’ai deman­dé aux tech­ni­ciens que cet échec soit, au mini­mum, signa­lé à l’u­ti­li­sa­teur, et sug­gé­ré de lan­cer d’autres ses­sions jus­qu’à la conver­sion inté­grale du texte.

Il arrive même que le plu­gin fusionne les fichiers tmp-*-post-*.mp3 alors que la liste est incom­plète, Google Cloud ayant aban­don­né la par­tie. Dans ce cas, le fichier post-*.mp3 ne couvre pas la tota­li­té du texte. On s’en aper­çoit en sur­veillant sous FTP le réper­toire /wp-content/uploads/speaker/, mais il serait utile que cette erreur soit ren­due visible sur l’in­ter­face — il suf­fi­rait pour cela de détec­ter la pré­sence de fichiers tmp-*-post-*.mp3.

Par­fois, il suf­fit de relan­cer la conver­sion pour que le time-out ne se pro­duise pas. Un fac­teur influant sur le résul­tat est donc cer­tai­ne­ment la vitesse des connexions et la dis­po­ni­bi­li­té des ser­veurs.

➡  Actuel­le­ment, le time-out empêche la trans­crip­tion vocale d’ar­ticles par­ti­cu­liè­re­ment longs sur ce site.

Utilisation du SSML

C’est un vaste sujet. La docu­men­ta­tion de SPEAKER (voir page) est incom­plète, et celle décri­vant le SSML (voir page) couvre des cas qui ne sont pas pris en charge dans SPEAKER.

Pre­nons comme exemple l’in­ser­tion de pauses pour laquelle SPEAKER four­nit un opcode qui peut être pla­cé (mais reste invi­sible) sur la page Word­Press, par exemple :

[@speaker-break time="2s" strength="none"]
(Supprimer le caractère ‘@’)

Ce for­mat opcode fonc­tionne, mais il ne peut pas être uti­li­sé dans une règle de réécri­ture (RegEx repla­ce­ment). La rai­son est que SPEAKER inter­prète ses opcodes avant d’ap­pli­quer les règles. La docu­men­ta­tion ne four­nit pas l’ex­pres­sion, après inter­pré­ta­tion, qui est un pur tag SSML :

<break time="2s" strength="none"></break>

Il n’est pas utile de com­men­ter ici le para­mètre « strength » qui agit sur le contour pro­so­dique.

La règle géné­rale concer­nant SSML est donc que tout opcode uti­li­sé par SPEAKER est trans­for­mé en une expres­sion de syn­taxe SSML, que le TTS de Google Cloud est capable de trai­ter. Plu­tôt qu’un opcode, on peut donc entrer direc­te­ment cette expres­sion sur la page web, mais il faut en tout cas le faire chaque fois qu’on uti­lise une règle de réécri­ture.

Les pauses per­mettent de cor­ri­ger le rythme de la phrase, mais aus­si d’empêcher une liai­son mal-t‑à pro­pos. Par exemple, cette règle inter­di­ra à Google Cloud de dire « un nari­cot » ou « les zari­cots » :

/(haricots?)/
<break time=".05s" strength="none"></break> $1

Les paren­thèses (en rouge) servent à cap­tu­rer le mot, avec ou sans “s”, qui est repro­duit dans la variable « $1 ». La pause de 50 mil­li­se­condes insé­rée avant « hari­cot » est inau­dible, mais elle empêche le TTS de faire la liai­son. Il est pos­sible qu’une voix Google Cloud bien entraî­née (à par­ler de hari­cots) ne fasse pas cette mau­vaise liai­son, mais la règle apporte une pré­cau­tion sup­plé­men­taire, qui s’a­vère néces­saire avec des mots inha­bi­tuels.

Une autre fonc­tion TTS très utile est le chan­ge­ment de voix et/ou de langue. Je l’ai auto­ma­ti­sée, sur ce site, pour chan­ger de voix à la lec­ture de cita­tions (voir ci-des­sous). Un opcode de chan­ge­ment de voix est par exemple :

[@speaker-voice name="en-GB-Wavenet-A"] Hello! [/speaker-voice]
(Supprimer le caractère ‘@’)

Il se tra­duit ain­si en SSML :

<voice name="en-GB-Wavenet-A"> Hello! </voice>

C’est sous cette der­nière forme qu’on l’u­ti­lise dans une règle de réécri­ture.

La fonc­tion « say-as » est très utile pour faire dire les dates en entier. Voi­ci par exemple un opcode qui fera dire « deux février deux-mille vingt-trois » au lieu de « deux sur zéro deux sur deux-mille vingt-trois » :

[@speaker-say‑as interpret-as="date" format="ddmmyyyy" detail="1"] 2/02/2023 [/speaker-say‑as]
(Supprimer le caractère ‘@’)

Ce for­mat accepte que les jours et les mois soient indi­qués par un seul chiffre. Il accepte d’autre part divers sépa­ra­teurs : « / », « – », etc.

On peut pro­gram­mer une règle pour que toute expres­sion res­sem­blant à une date en fran­çais soit lue (dans la langue choi­sie) comme une date :

/([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})\)\.?/
<say-as interpret-as="date" format="ddmmyyyy">$1/$2/$3</say-as>

Pour les novices des expres­sions régu­lières, « [0–9]{1,2} » repré­sente une suite de 1 ou 2 chiffres. Les paren­thèses (en rouge) sur la pre­mière ligne servent à cap­tu­rer les expres­sions qui sont ensuite affec­tées aux variables $1, $2 et $3.

Une fonc­tion SSML qui n’est actuel­le­ment pas gérée par SPEAKER est la pho­né­tique (selon l’al­pha­bet IPA). Par exemple, l’ex­pres­sion :

Le <phoneme alphabet="ipa" ph="ˈhændbʊk ɒv njuːˈtrɪʃᵊnᵊl ˈvæljuː ɒv fuːdz ɪn ˈkɒmən ˈjuːnɪts">Handbook of Nutritional Value of Foods in Common Units</phoneme>

est sim­ple­ment trans­crite comme « Le Hand­book of Nutri­tio­nal Value of Foods in Com­mon Units » qui est bien sûr mal pro­non­cé par le TTS fran­co­phone. On peut ici contour­ner le pro­blème en chan­geant de voix/langue :

Le <voice name="en-GB-Wavenet-A"> Handbook of Nutritional Value of Foods in Common Units </voice>

Cela sonne très chic, mais les chan­ge­ments de voix/langue peuvent poser d’autres pro­blèmes, voir ci-des­sous.

Programmation des règles de réécriture

Si vous n’êtes pas habitué·e à la syn­taxe éso­té­rique (bien que par­fai­te­ment logique) des expres­sions régu­lières, vous en serez deve­nu expert·e une fois ache­vé le bon réglage d’un TTS en fran­çais !  😀

Dans l’in­ter­face de SPEAKER, les règles (RegEx repla­ce­ments) s’é­crivent sur deux lignes. L’ou­bli ou l’a­jout d’une ligne (même vide) fait échouer tota­le­ment le pro­ces­sus, bien sou­vent sans que vous en soyez averti·e. Même désastre si une seule règle contient la moindre erreur de syn­taxe… Il serait bien­ve­nu de dis­po­ser d’un véri­fi­ca­teur de syn­taxe de l’en­semble des règles dans un script PHP sépa­ré ou sur un ser­vice en ligne, when time per­mits !

Voi­ci, pour com­men­cer, une règle qui détecte le début du texte (le sym­bole « ^ ») afin d’in­sé­rer une phrase au début de la lec­ture :

/^/
Bonjour ! Cette transcription vocale a été réalisée automatiquement. Merci de m'en signaler les erreurs de prononciation ! <break time="1s" strength="none"></break>

Atten­tion : ce sont seule­ment deux lignes. On recon­naît l’u­ti­li­sa­tion d’une pause de 1 seconde, en fin de phrase, pour la sépa­rer de la lec­ture pro­pre­ment dite.

De nom­breuses règles servent à lire une abré­via­tion, comme le ferait un lec­teur bien édu­qué. Par exemple, l’ex­pres­sion « et al. » devrait être lue « et col­lègues ». Voi­ci la règle :

/([^A-Z^a-z])et\s+al\./
$1et collègues

On déclare sur la pre­mière ligne que « et » ne doit pas être pré­cé­dé d’une autre lettre (« [^A‑Z^a‑z] ») et qu’il doit être sui­vi d’au moins une espace (« \s+ »). Le point de « al. » est repré­sen­té pré­cé­dé d’un carac­tère d’é­chap­pe­ment : « \. ». Le carac­tère non-alpha­bé­tique cap­tu­ré entre les paren­thèses (en rouge) est repro­duit par la variable $1.

Pour les infor­ma­ti­ciens : la règle qui pré­cède est exé­cu­tée par SPEAKER en appe­lant la fonc­tion preg_replace() en PHP :

$text = preg_replace("/([^A-Z^a-z])et\s+al\./", "$1et collègues", $text);

Voi­ci d’autres exemples de règles :

/([^A-Z^a-z])[Ee]\.g\.\s/
$1par exemple 

pour inter­pré­ter « e.g. » ou « E.g. » = exem­pli gra­tia. L’ex­pres­sion « [Ee] » recon­naît « E » ou « e ». Cette règle ne fonc­tionne pas si une espace est pré­sente, comme dans « e. g. ».

/TLF[Ii]?/
dictionnaire « Trésor de la langue française »

/([^A-Z^a-z])M\.D\./
$1docteur en médecine

Ne pas oublier le « $1 » au début, qui a cap­tu­ré le carac­tère pré­cé­dant « M », quel qu’il soit…

/整体/u
terme japonais

Ici, on ne demande pas au TTS de lire le mot « sei­tai » en japo­nais, car il est déjà dit dans la phrase « … le sei­tai (整体)… », mais sim­ple­ment de pré­ci­ser que c’est un terme japo­nais. Noter l’op­tion « /u » qui veut dire que la cible doit être lue comme de l’Uni­code. Il est pru­dent d’a­jou­ter cette option « /u » à toutes les règles.

Et, pour­quoi pas, décli­ner les sigles fran­çais inter­mi­nables :

/ANSES/
Agence nationale de sécurité sanitaire de l’alimentation de l’environnement et du travail

ou des abré­via­tions fré­quentes dans les publi­ca­tions médi­cales :

/<span\sclass=\"caps\">RR<\/span>/
risk reysho 
/<span\sclass=\"caps\">OR<\/span>/
odd reysho 
/<span\sclass=\"caps\">IC<\/span>/
intervalle de confiance a

On doit écrire « rey­sho » pour pro­non­cer « ratio » à peu près comme en anglais… Ou, si l’on pré­fère, chan­ger de langue :

/<span\sclass=\"caps\">RR<\/span>/
<voice name="en-GB-Wavenet-A">risk ratio</voice> 

On com­mence à voir ici que l’in­ter­pré­ta­tion, grâce aux règles de réécri­ture, peut s’ap­pro­cher autant que sou­hai­té d’un lec­teur humain.

Corriger le français

De nom­breuses règles appa­raissent à l’u­sage (en écou­tant les trans­crip­tions vocales sur des pages entires), qui tiennent aux « trous dans la raquette » de l’ap­pren­tis­sage auto­ma­tique.

Par exemple, si un mot ne figure pas dans le dic­tion­naire fran­çais, et si par contre il existe en anglais, le robot le pro­non­ce­ra à l’an­glaise. C’est gênant pour cer­tains mots qui ont migré de l’an­glais vers le fran­çais et dont on a adap­té la pro­non­cia­tion. Par exemple, « occur­rence », qui n’est pas cor­rect en fran­çais, bien que fré­quem­ment employé aujourd’­hui, est pro­non­cé à l’an­glaise… Pour s’en pré­mu­nir, il faut en modi­fier l’or­tho­graphe jus­qu’à ce qu’une pro­non­cia­tion cor­recte soit réa­li­sée. La solu­tion est simple :

/occurence/
occurance

De même :

/urgents?/u
ûr jean

À l’in­verse, le nom du jour­nal « The Lan­cet » est pro­non­cé de manière incom­pré­hen­sible (si on ne bas­cule pas la langue vers l’an­glais). Une solu­tion est :

/The\sLancet/u
ze lent sept

On remarque ici qu’il faut tou­jours essayer de « don­ner à man­ger » des mots fran­çais pour qu’ils soient pro­non­cé sans hési­ta­tion. Peu importe que le texte n’ait pas de sens : le TTS actuel n’a­na­lyse pas du tout le sens du texte — contrai­re­ment aux excel­lents tra­duc­teurs auto­ma­tiques.

Cer­tains mots se pro­noncent dif­fé­rem­ment selon le contexte, que le TTS fran­çais ne sait pas tou­jours iden­ti­fier. C’est le cas de « fier » dont le “r” ne doit pas être pro­non­cé s’il s’a­git d’un verbe à l’in­fi­ni­tif. La règle sui­vante per­met d’y remé­dier :

/([mts]e\s+)fier(\s+[aà])/u
$1fié$2
/([y]\s+)fier([^\p{L}])/u
$1fié$2

Avec cette règle, le “r” est pro­non­cé ou inhi­bé cor­rec­te­ment dans une expres­sion comme : « On ne peut se fier à lui, se fier au temps, ne pas s’y fier, un fier à bras, ce fier à bras. »

Syllabes oubliées ou déformées

Dans cer­tains cas, heu­reu­se­ment rares, le TTS fran­co­phone esca­mote des syl­labes ou même des mots très courts à la fin d’une uni­té de souffle. Par exemple, « migrantes » sui­vi d’une vir­gule sera pro­non­cé « migrants ». Pour évi­ter cela, on a besoin de règles spé­ci­fiques, par exemple :

/ante(s?)([^a-z])/u
anthe$1$2

Noter que le $1 cap­ture le « s » du plu­riel éven­tuel, ce qui per­met d’ef­fec­tuer la liai­son si néces­saire.

Un autre défaut consta­té est l’es­ca­mo­tage (occa­sion­nel) de la der­nière syl­labe de mots tels que « nécrose », « cétose », etc. Il semble qu’il ait sur­tout lieu avec des mots d’au moins deux syl­labes, ce qui exclut « chose ». La règle sui­vante per­met d’y remé­dier :

/(\pL{3})ose([^\pL])/u
$1oze$2

La règle sui­vante empêche le TTS de pro­non­cer à l’an­glaise le verbe « per­fuse » :

/([^a-z])perfuse([^a-z])/u
$1pairfûse$2

Sigles

Dans sa ver­sion actuelle, le TTS fran­co­phone gère assez bien la pro­non­cia­tion de sigles cou­rants, somme « UNESCO » qui est pro­non­cé « unès­ko », ou « CIA » qui est épe­lé au lieu d’être pro­non­cé « scia ». Mais l’au­to­mate pro­nonce par exemple « ops » pour « OPS » au lieu de l’é­pe­ler. On a donc besoin, dans ce cas, de la règle :

/([^\p{L}])OPS([^\p{L}])/u
$1o p s$2

On voit ici appa­raître l’ex­pres­sion « \pL » (ou « \p{L} ») qui désigne n’im­porte quel carac­tère Uni­code repré­sen­tant une lettre (majus­cule ou minus­cule). En effet, l’ex­pres­sion « [A‑Za‑z] » ne recon­naît pas des carac­tères comme le « é » de « nécrose ». L’ex­pres­sion « ^ \p{L} » désigne donc ici n’im­porte quel carac­tère autre qu’al­pha­bé­tique.

Autre exemple de pro­non­cia­tion à cor­ri­ger : le sigle « CRISPR » que la machine a ten­dance à épe­ler.

/CRISPR/u
crisp r

Bien enten­du, cer­taines règles devien­dront inutiles lorsque les auto­mates TTS auront amé­lio­ré leur entraî­ne­ment. Mais nous essuyons les plâtres !

Écriture inclusive

J’ai aver­ti que les TTS ne savaient pas lire l’é­cri­ture inclu­sive. Tou­te­fois, s’en tire pas trop mal si l’in­ter­pré­ta­tion se résume à sup­pri­mer le point qui figure dans un mot, et que j’é­cris sys­té­ma­ti­que­ment « · » (option-majus­cu­le‑f sur un cla­vier Mac) :

/·/u
 

Atten­tion : la deuxième ligne est vide ! Avec cette règle, le mot « intelligent·e·s » sera lu comme « intel­li­gentes ». Le fémi­nin l’emporte, qui s’en plain­drait ? 😀

Une forme plus ancienne d’é­cri­ture inclu­sive est l’u­sage de paren­thèses, par exemple dans l’ex­pres­sion « Tou(te)s les Français(es) ». Elle sera lue « Toutes ou tous les Fran­çaises ou Fran­çais » en appli­quant la règle sui­vante :

/([\s\[>“])(\pL+?)\((\pL+?)\)(\pL*?)([\.,\?!:;\s<”\)\]])/u
$1$2$3 ou $1$3$4

Les paren­thèses (sou­li­gnées ici en rouge) servent à cap­tu­rer les chaînes repro­duites dans $1, $2, $3, $4 et $5.

Noter par exemple l’ex­pres­sion « [\s\[>“] » cap­tu­rée dans $1 : ce sont tous les carac­tères qui peuvent pré­cé­der le pre­mier mot. Il s’a­git de l’es­pace, du cro­chet « [« , du signe « > » ou du guille­met anglais « “ ». Le signe « > » peut appa­raître à la suite d’un élé­ment « <em> », « <strong> », etc. Cette liste n’in­clut pas le guille­met ouvrant fran­çais, car wp-Typo­gra­phy le conver­tit en ”&bsp ;”, donc sui­vi d’une espace.

Autre usage de parenthèses

La règle pré­cé­dente ne per­met pas de lire une expres­sion comme « se (re)mettre au tra­vail ». Alors qu’on avait accor­dé la pri­mau­té au fémi­nin, donc la forme la plus longue, dans la règle pré­cé­dente, il faut cette fois lire en second le conte­nu de la paren­thèse, ce qui donne « se mettre ou remettre au tra­vail ». On ajoute donc cette règle :

/([\s\[>“])\((\pL+?)\)(\pL+?)([\.,\?!:;\s<”\)\]])/u
$1$3 ou $2$3$4

Conversions code HTML vers Unicode

Pour que les exemples pré­cé­dents fonc­tionnent, il faut au préa­lable avoir conver­ti le « ç » et d’autres carac­tères étran­gers à l’al­pha­bet anglais, à par­tir de leur code HTML :

/&ccedil;/u
ç

Même néces­si­té pour toutes les autres lettres sujettes à un enco­dage HTML spé­cial :

/&agrave;/u
à
/&acirc;/u
â

etc.

/&ldquo;/u
“
/&rdquo;/u
”

etc.

Une fois ces conver­sions ter­mi­nées, si l’on veut recon­naître toutes les lettres minus­cules du fran­çais, on pour­ra uti­li­ser l’ex­pres­sion « [a‑zàâçéèêëîïôûùüÿñæœ] ».

Signes non-alphabétiques

Des émo­ti­cônes figurent dans l’al­pha­bet Uni­code au sens large… On peut écrire quelques règles en les uti­li­sant direc­te­ment :

/⏱/u
 … image d'horloge —

Noter l’op­tion « /u » qui est ici obli­ga­toire.

Mais cela ne fonc­tionne jamais avec cer­tains carac­tères, comme par exemple le rond bleu « 🔵 ». Dans ce cas, il fau­dra aller cher­cher la valeur de ce carac­tère en déci­mal : 128309.

Puis on pro­gramme une règle avec cette valeur :

/&#128309;/u
… c'est un rond bleu …

Les règles (RegEx repla­ce­ments) sont appli­quées une seule fois de haut en bas. Ce qui per­met d’af­fi­ner cer­taines inter­pré­ta­tions. Par exemple, on aime­rait que le sigle « ™ » (marque com­mer­ciale, codé « &trade ; ») ne soit pas lu quand il figure à la fin d’un mot, mais qu’il soit expli­ci­té dans tout autre contexte. Deux règles suf­fisent à cela :

/([a-z])&trade/u
$1
/&trade/u
 signe de marque commerciale 

Sur ce site, j’u­ti­lise un rond blanc pour mar­quer le début et la fin d’un extrait. Les règles sui­vantes le rendent expli­cite à la lec­ture :

/<p>\s*⚪️/u
 … Début d'extrait … 
/⚪️\s*<\/p>/u
 … Fin d'extrait … 

Ou, en uti­li­sant les codes HTML numé­riques :

/<p>\s*&#9898;&#65039;/u
 … Début d'extrait … 
/&#9898;&#65039;\s*<\/p>/u
 … Fin d'extrait … 

J’en viens à la règle très impor­tante qui per­met d’ef­fa­cer tous les soft hyphens « &shy ; », à pla­cer au som­met des RegEx repla­ce­ments :

/&shy;/u
 

(La deuxième ligne est vide.)

Où peut-on trou­ver les codes HTML numé­riques de ces carac­tères non-alpha­bé­tiques ? Tout sim­ple­ment dans le fichier de trace fabri­qué par (mon patch de) SPEAKER !

Un visage mécon­tent « 😣 » y appa­raît par exemple comme « &#128547 ; » qui per­met de le pla­cer dans la règle :

/&#128547;/u
… (visage mécontent)… 

Si l’on uti­li­sait direc­te­ment le carac­tère « 😣 » dans cette règle, l’en­semble des réécri­tures se plan­te­rait, ain­si que la conver­sion TTS… Sans qu’on en soit aver­ti ! 😣😣😣

Corrections de typographie

Sans cor­rec­tion, une expres­sion comme « […] avec l’Agence euro­péenne du médi­ca­ment […] » n’est pas pro­non­cée cor­rec­te­ment car les ita­liques sont rem­pla­cés par des che­vrons avec espaces, ce qui donne :

[…] avec l'« Agence européenne du médicament » […]

Dans ce cas, la liai­son entre « l”  » et « Agence » n’est pas pro­non­cée, et on entend « elle agence »… Pour cor­ri­ger ce défaut il suf­fit d’a­jou­ter la règle :

/([A-Za-z])'&laquo;\s*/u
&laquo; $1'

ce qui donne :

[…] avec « l'Agence européenne du médicament » […]

Unités de mesure

Il est impor­tant, pour lire des textes scien­ti­fiques, d’é­non­cer cor­rec­te­ment les uni­tés de mesure. Si le TTS fran­co­phone de Google Cloud tra­duit cor­rec­te­ment « g/l » par « grammes par litre », il ne fonc­tionne pas avec toutes les com­bi­nai­sons d’u­ni­tés, comme par exemple « µg/dl » qui doit être lu « micro­grammes par déci­litre ». Le mieux est donc d’ins­tal­ler deux ensembles de règles, les pre­mières pour les numé­ra­teurs et les secondes pour les déno­mi­na­teurs. En voi­ci un extrait.

Règles de numé­ra­teurs :

/\s+g\//u
 gramme/
/\s+dg\//u
 décigramme/
/\s+cg\//u
 centigramme/

Noter qu’on a bien pré­ser­vé le « / » qui va ser­vir de contexte aux règles de déno­mi­na­teurs :

/\/[Kk]g([\.,\?!:;\s<\)\]\/])/u
 par kilogramme$1
/\/g([\.,\?!:;\s<\)\]\/])/u
 par gramme$1
/\/m[Ll]([\.,\?!:;\s<\)\]\/])/u
 par millilitre$1
/\/c[Ll]([\.,\?!:;\s<\)\]\/])/u
 par centilitre$1
/\/d[Ll]([\.,\?!:;\s<\)\]\/])/u
 par décilitre$1

À noter, l’ex­pres­sion « [\.,\?!:;\s<\)\]\/] » qui repré­sente n’im­porte quel carac­tère pou­vant appa­raître après une uni­té de mesure.

Pour le sym­bole du litre, on a admis ici que les deux abré­via­tions « l » et « L » sont accep­tables, d’où l’ex­pres­sion « [Ll] ».

Il faut aus­si tenir compte des expo­sants, par exemple dans « 9.81 m/s2« . Pour cela, la règle du déno­mi­na­teur sera :

/\/s<sup>2<\/sup>/u
 par seconde au carré

Meme chose pour les autres puis­sances.

Cette méthode fonc­tionne avec des uni­tés plus com­plexes, par exemple pour dire « 15 mg/kg/h ».

De nom­breux bri­co­lages avec les chiffres sont pos­sibles. On sou­haite par exemple que « 15h25 » soit lu « quinze heures vingt-cinq » plu­tôt que « quinze hache vingt-cinq », mais que « 17h00 » soit sim­ple­ment lu « dix-sept heures » Les règles sui­vantes sont suf­fi­santes :

/([0-9]{1,2})h00/u
$1 heure 
/([0-9]{1,2})h([0-9]{0,2})/u
$1 heure $2 

Liaisons

Actuel­le­ment (début 2023), les voix fran­çaises sot peu fiables au niveau des liai­sons. Plus pré­ci­sé­ment, elles oublient des liai­sons qui seraient for­te­ment recom­man­dées dans un style d’é­lo­cu­tion « aca­dé­mique »… Il est donc néces­saire de les pro­gram­mer.

Le trai­te­ment de ces liai­sons oblige à pas­ser par des variables inter­mé­diaires. J’u­ti­lise ZZ”, TT”, NN” et PP” pour mar­quer une liai­son, avec des règles finales qui les rem­placent par des carac­tères fami­liers au TTS :

/ZZ'/u
z'
/NN'/u
n'
/PP'/u
p'
/TT'/u
t'

Par exemple, pour lire « les beaux arbres », la règle sui­vante a été appli­quée :

/([eau]xz)\s+([aàeéèêiîouyh])/u
$1 ZZ'$2

ce qui don­ne­ra dans un pre­mier temps « les beaux ZZ’arbres », puis en fin de trai­te­ment « les beaux z’arbres ».

Cet exemple n’est pas for­cé­ment per­ti­nent, car la plu­part des voix pro­duisent déjà la liai­son cor­recte. Il faut évi­ter de créer des liai­sons là où elles auraient été créées auto­ma­ti­que­ment, car l’a­jout de code (exemple « ils z’a­vaient ») altère par­fois le pro­fil pro­so­dique de la phrase, créant des accen­tua­tions peu réa­listes.

La méthode est donc plus com­pli­quée, car les règles de liai­son sont contex­tuelles, et les excep­tions nom­breuses. Pour les mettre au point, il faut écou­ter les ver­sions orales d’à peu près toutes les pages et articles du site. Pour évi­ter une fac­tu­ra­tion exces­sive de TTS, on peut ras­sem­bler les points liti­gieux dans un petit texte « bac à sable » sur lequel on véri­fie le bon fonc­tion­ne­ment de la trans­crip­tion orale.

Par exemple, les expres­sions « nous z’a­vons », « vous z’a­vez » ou « les z’ans » ont un très mau­vais ren­du en TTS. Il faut donc ajou­ter des règles comme :

/ZZ'avez/u
zavés
/ZZ'avons/u
zavons
/ZZ'an/u
zan

Le « s » de « zavés » est indis­pen­sable car le TTS pro­non­ce­rait « z’a­vé » comme « z a vé é accent aigu » ! Il a ten­dance à épe­ler les mots courts qui ne sont pas dans son dic­tion­naire — ou plu­tôt, le dic­tion­naire invi­sible qu’il a construit dans ses « neu­rones ». Le plus simple est peut-être de s’ins­pi­rer du lan­gage SMS…

Les apos­trophes pro­duites par les règles de liai­sons peuvent aus­si défor­mer de manière insa­tis­fai­sante le contour pro­so­dique. C’est pour­quoi « zavons » est d’un meilleur ren­du que « z’a­vons ».

Il faut for­cer la liai­son dans des expres­sions comme « prêt-à-pen­ser » ou « prêt‑à por­ter » qui sont mal lues par le TTS. Cette règle cor­rige l’er­reur :

/prêt\-à/u
prêt ta

On a aus­si besoin de règles d’ef­fa­ce­ment. Par exemple, pour évi­ter d’en­tendre « des z’hau­teurs » ou « des z’hau­bans », on ajoute la règle :

/ZZ'hau/u
hau

On peut enfin, par sécu­ri­té, effa­cer toutes les liai­sons pro­duites acci­den­tel­le­ment par d’autres règles mal confi­gu­rées :

/TT'([bcdfgjklmnpqrstvwxz])/u
$1
/NN'([bcdfgjklmnpqrstvwxz])/u
$1
/ZZ'([bcdfgjklmnpqrstvwxz])/u
$1
/PP'([bcdfgjklmnpqrstvwxz])/u
$1
/TT'([\d\.,\?!:;\s<\)\]])/u
$1
/NN'([\d\.,\?!:;\s<\)\]])/u
$1
/ZZ'([\d\.,\?!:;\s<\)\]])/u
$1
/PP'([\d\.,\?!:;\s<\)\]])/u
$1

Le sym­bole « \d » repré­sente ici un chiffre. Il est équi­valent à « [0–9] » que j’ai ten­dance à pré­fé­rer car il est plus expli­cite.

Les liai­sons contraintes par des règles peuvent entraî­ner la mau­vaise pro­non­cia­tion de mots courts dont la pro­non­cia­tion est alors, soit emprun­tée à l’an­glais, soit sim­ple­ment épe­lée. Par exemple, la conver­sion de « vous avez eu » en « vous z’a­vez z’eu » ne donne pas un son cor­rect. Le résul­tat est obte­nu avec « vous zavés z’û ». On a appli­qué ici la séquence de règles (plus géné­rales) sui­vantes :

/([eau]xz)\s+([aàeéèêiîouyh])/u (appliquée 2 fois)
$1 ZZ'$2
/ZZ'avez/u (appliquée 1 fois)
zavés
/([\s'])eue?s?([\.,\?!:;\s<\)\]])/u (appliquée 1 fois)
$1û$2
/ZZ'/u (appliquée 2 fois)
z'

On devine ici que l’ordre des règles (RegEx repla­ce­ments) est cri­tique dans cette gram­maire for­melle. On le cor­rige en écou­tant de nom­breux exemples…

Titres et légendes

Pour annon­cer les titres, on peut uti­li­ser des règles du style :

/<h1[^>]*>/u
<break time="1s" strength="none"></break>Titre de niveau 1… …
/<h2[^>]*>/u
<break time="1s" strength="none"></break>Titre de niveau 2… …
/<\/h1>/u
… … <break time="1s" strength="none"></break>
/<\/h2>/u
… … <break time="1s" strength="none"></break>

La ques­tion des légendes de figures est plus déli­cate. Il est utile de lire les légendes et de les décla­rer comme légendes, sauf si elles sont vides. D’autre part, une légende comme « Source : … » n’est pas utile en lec­ture. Les règles que j’u­ti­lise, et que les experts de RegEx com­pren­dront sans dif­fi­cul­té, sont les sui­vantes :

/<img\s[^\/]*?\/>/u

/<img\s.*?>/u

/<iframe\s[^<]+?<\/iframe>/u

/<span\sclass=\"caption\-text\">(.*?)<\/span>/u
$1
/<figure\s[^>]*?>(.*?)<\/figure>/u
$1
/<figcaption[^>]*?>\s*Source.+?<\/figcaption>/u

/<figcaption[^>]*?>\s*?<\/figcaption>/u

/<figcaption[^>]*?>(.+?)<\/figcaption>/u
… Image avec légende « $1 » (fin de légende)… <p>…</p>

La séquence « <p>…</p> » sur la der­nière règle est un autre moyen de ména­ger une courte pause sans affec­ter le contour pro­so­dique.

Ces règles sont com­pa­tibles, sur ce site, avec l’u­ti­li­sa­tion des plu­gins wp-Typo­gra­phy pour les textes et Opti­mole pour les images. Pour les adap­ter à d’autres confi­gu­ra­tions, il faut ana­ly­ser avec soin le ren­du de la page, en mode « code » sur le navi­ga­teur, qui est plus détaillé que le mode « code » dans l’é­di­teur de Word­Press, car il intègre des anno­ta­tions typo­gra­phiques.

Changement de voix ou de langue

Pour la tra­duc­tion de phrases ou d’ex­pres­sions en d’autres langues, je ne recom­mande pas d’in­sé­rer chaque fois l’ex­pres­sion SSML com­plète. Non seule­ment c’est fas­ti­dieux, avec un risque d’er­reur, mais par ailleurs on peut sou­hai­ter par la suite choi­sir une voix nou­velle pour la langue concer­née.

Le plus simple est de décla­rer la langue (et le genre) dans une classe CSS. Par exemple :

Le <em class="male-en">Handbook of Nutritional Value of Foods in Common Units</em>

si l’ex­pres­sion est en ita­liques, ou sim­ple­ment, sans les ita­liques :

Le <span class="male-en">Handbook of Nutritional Value of Foods in Common Units</span>

On uti­lise ensuite les règles sui­vantes, par exemple pour l’an­glais, l’al­le­mand, l’i­ta­lien et l’es­pa­gnol au mas­cu­lin et au fémi­nin. Ces règles modi­fient la voix/langue tout en ajus­tant la vitesse d’é­lo­cu­tion pour com­pen­ser la modi­fi­ca­tion glo­bale pro­gram­mée dans la langue prin­ci­pale. Pour le fran­çais, on a choi­si d’aug­men­ter de 20 % la vitesse. Par consé­quent, pour les langues étran­gères on la dimi­nue de 20 %, ce qui donne :

/<[^\s]+?\s+class=\"male\-en\"\s*>(.+?)<\/[^>]+?>/u
<voice name="en-GB-News-J"><prosody rate="80%">$1</prosody></voice>
/<[^\s]+?\s+class=\"female\-en\"\s*>(.+?)<\/[^>]+?>/u
<voice name="en-GB-News-I"><prosody rate="80%">$1</prosody></voice>
/<[^\s]+?\s+class=\"male\-de\"\s*>(.+?)<\/[^>]+?>/u
<voice name="de-DE-Wavenet-B"><prosody rate="80%">$1</prosody></voice>
/<[^\s]+?\s+class=\"female\-de\"\s*>(.+?)<\/[^>]+?>/u
<voice name="de-DE-Wavenet-C"><prosody rate="80%">$1</prosody></voice>
/<[^\s]+?\s+class=\"male\-it\"\s*>(.+?)<\/[^>]+?>/u
<voice name="it-IT-Standard-D"><prosody rate="80%">$1</prosody></voice>
/<[^\s]+?\s+class=\"female\-it"\s*>(.+?)<\/[^>]+?>/u
<voice name="it-IT-Standard-B"><prosody rate="80%">$1</prosody></voice>
/<[^\s]+?\s+class=\"male\-es\"\s*>(.+?)<\/[^>]+?>/u
<voice name="es-ES-Neural2-F"><prosody rate="80%">$1</prosody></voice>
/<[^\s]+?\s+class=\"female\-es"\s*>(.+?)<\/[^>]+?>/u
<voice name="es-ES-Neural2-E"><prosody rate="80%">$1</prosody></voice>

➡ Les chan­ge­ments de vitesse d’é­lo­cu­tion n’ont pas encore été appli­qués à tous les articles du site.

Un avan­tage de dis­po­ser de deux règles uniques (mâle-femelle) pour chaque langue est qu’il suf­fi­ra de modi­fier une seule de ces règles si l’on choi­sit une autre voix, sans avoir à cor­ri­ger les textes des pages ou articles concer­nés.

Atten­tion : cette méthode ne fonc­tionne que si la classe (« male-en » etc.) est attri­buée à l’élé­ment HTML le plus proche du texte. Concrè­te­ment, elle ne fonc­tion­ne­rait pas ici :

Le <em class="male-en"><strong>Handbook of Nutritional Value of Foods in Common Units</strong></em>

Il fau­drait cor­ri­ger le texte ain­si :

Le <em><strong class="male-en">Handbook of Nutritional Value of Foods in Common Units</strong></em>

Un incon­vé­nient de la ver­sion actuelle de SPEAKER (4.0.13) est que le même ensemble de règles s’ap­plique à toutes les langues uti­li­sées sur une page ou un article, de sorte que des liai­sons dan­ge­reuses pour­raient être impo­sées aux textes en langues étran­gères… On peut par­tiel­le­ment les neu­tra­li­ser, je ne l’ex­pli­que­rai pas ici. J’ai signa­lé ce pro­blème dans mon rap­port, et l’é­quipe tech­nique a annon­cé qu’elle pré­voyait dans une pro­chaine ver­sion la ges­tion de règles spé­ci­fiques aux voix/langues.

Citations

J’ai pro­gram­mé des règles pour que les conte­nus de cita­tions soient lus avec une voix dif­fé­rente de celle du texte prin­ci­pal :

/<blockquote[^>]*>/u
<voice name="fr-FR-Wavenet-C"> … Début de citation…
/<\/blockquote>/u
</voice> Fin de citation… 

Ça fonc­tionne tant que SPEAKER ne trouve pas un élé­ment « </p> » dans la cita­tion. En effet, il peut uti­li­ser cet élé­ment pour frag­men­ter le texte (dans la limite de 4500 carac­tères), auquel cas les frag­ments sui­vants reviennent à la voix/langue par défaut.

La solu­tion la plus simple est de sup­pri­mer les « </p><p> » dans les cita­tions, ce qui n’est appa­rem­ment pas fai­sable auto­ma­ti­que­ment, mais qui impose de rem­pla­cer les marques de para­graphes par de simples sauts de ligne dans chaque cita­tion.

Regar­dons pour cela la page Word­Press en mode « code ». Au lieu d’é­crire :

<!-- wp:quote {"extUtilities":[]} -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>Blah blah 1</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Blah blah 2</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

on écri­ra :

<!-- wp:quote {"extUtilities":[]} -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>Blah blah 1<br><br>Blah blah 2</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

Cette solu­tion fonc­tionne bien, sauf qu’elle peut pro­duire des frag­ments de texte supé­rieurs aux 4500 carac­tères auto­ri­sés par Google Cloud. Ma ver­sion pat­chée de SPEAKER aver­tit l’u­ti­li­sa­teur : à lui/elle de s’ar­ran­ger pour scin­der la cita­tion en plu­sieurs mor­ceaux si elle est trop longue.

Un autre défaut de cette méthode de chan­ge­ment de voix dans les cita­tions appa­raît lors­qu’une expres­sion en langue étran­gère figure dans une cita­tion. Le chan­ge­ment de voix/langue se fera cor­rec­te­ment pour l’é­non­cer, mais ensuite le sys­tème revien­dra à la voix d’o­ri­gine, au lieu de celle pré­vue pour les cita­tions. Ce pro­blème est réso­lu en ajou­tant une expres­sion (invi­sible) qui force le retour à la voix de cita­tion, par exemple :

Le <em class="female-en"><strong>Handbook of Nutritional Value of Foods in Common Units</strong></em><span class="citation"></span>

La cor­rec­tion de voix sera assu­rée par la règle :

/<span\s+class=\"citation\">[^<]*?<\/span>/u
<voice name="fr-FR-Wavenet-C">

On note ici qu’il n’est pas gênant de ne pas avoir d’élé­ment « </voice> » à la fin d’un frag­ment de texte. SPEAKER se débar­rasse en fait des élé­ments « <voice> » en les rem­pla­çant par des para­mètres trans­mis à Google Cloud avec chaque frag­ment de texte.

Conclusion

Tot ce qui pré­cède s’ap­plique à l’u­ti­li­sa­tion de voix fran­co­phones Google Cloud au stade de déve­lop­pe­ment de début 2023. Il est rai­son­nable d’es­pé­rer que des voix plus entraî­nées ver­ront le jour, qui per­met­tront de se pas­ser d’un grand nombre de règles — notam­ment pour les liai­sons en fran­çais.

Recommander
Translate - Traduire