TTS: Hora Catalana
Contingut
Introducció
Hora Catalana:
D'aquí es pot agafar el codi. Es pot fer una millora: els apòstrofs. Hauria de ser dos quarts d'una en comptes de dos quarts de una. He fet les primeres proves de fer sonar el Festival a través de NodeJS:
- Langtrainer:_Text_To_Speech-TTS#Fer_sonar_Festival_a_trav.C3.A9s_de_NodeJS_.28Javascript.29
Codi
El principal problema que m'he trobat és les funcions de write i append de la llibreria fs (fs.write), que són asíncrones. Això té fàcil solució utilitzant la versió sync: fs.writeSync. Si faig servir la versió asíncrona, per escriure una línia he d'esperar que l'anterior s'hagi acabat d'escriure.
script node: hora_catalana.js
Té per missió calcular l'hora catalana; generar el fitxer hora_catalana.scm; i cridar el script hora_catalana.sh
//càlcul de l'hora catalana: basat en el codi de: https://www.horacatalana.cat/ (Carles Pujol i Torrecillas) let hora_catalana = Hnum() console.log(hora_catalana) fs = require('fs'); //fs.open('prova_tts.scm', 'w', function (err, file) { // if (err) throw err; // console.log('Saved!'); fs.writeFile('hora_catalana_tts.scm', '(voice_upc_ca_ona_hts)', function (err,data) { if (err) { return console.log(err); } console.log(data); fs.appendFile('hora_catalana_tts.scm', '(SayText "' + hora_catalana + '")', function (err,data) { //fs.appendFile('prova_tts.scm', '(SayText "hola catalunya")', function (err,data) { if (err) { return console.log(err); } console.log(data); sonar_festival() }); }); //}); function sonar_festival() { var cp = require('child_process'); var ls = cp.spawn('bash', ['hora_catalana.sh']); ls.stdout.on('data', function(data) { console.log('Message: ' + data); }); ls.on('close', function(code, signal) { console.log('festival finished...'); }); } function Hnum(){ H = new Date() currentHours = H.getHours(); currentMinutes =H.getMinutes(); currentSeconds = H.getSeconds(); currentHours = ( currentHours < 10 ? "0" : "" ) + currentHours; currentMinutes = ( currentMinutes < 10 ? "0" : "" ) + currentMinutes; currentSeconds = ( currentSeconds < 10 ? "0" : "" ) + currentSeconds; nomMes=""; switch(H.getMonth()) { case 0: nomMes="de Gener"; break; case 1: nomMes="de Febrer"; break; case 2: nomMes="de Març"; break; case 3: nomMes="d'Abril"; break; case 4: nomMes="de Maig"; break; case 5: nomMes="de Juny"; break; case 6: nomMes="de Juliol"; break; case 7: nomMes="d'Agost"; break; case 8: nomMes="de Setembre"; break; case 9: nomMes="d'Octubre"; break; case 10: nomMes="de Novembre"; break; case 11: nomMes="de Desembre"; break; } var Hora = H.getHours(); var Minuts = H.getMinutes(); if(Minuts>10){ Hora=Hora+1; if(Hora>23){ Hora=0; } } var HoraTxt=""; var Txt=""; var Art1=""; var Art2=""; if(Hora==1||Hora==11){ Art1="d'"; Art2="la "; }else{ Art1="de "; Art2="les "; } switch(Hora) { case 1: HoraTxt="una"; break; case 2: HoraTxt="dues"; break; case 3: HoraTxt="tres"; break; case 4: HoraTxt="quatra"; break; case 5: HoraTxt="cinc"; break; case 6: HoraTxt="sis"; break; case 7: HoraTxt="set"; break; case 8: HoraTxt="vuit"; break; case 9: HoraTxt="nou"; break; case 10: HoraTxt="deu"; break; case 11: HoraTxt="onze"; break; case 12: HoraTxt="dotze"; break; case 13: HoraTxt="una"; break; case 14: HoraTxt="dues"; break; case 15: HoraTxt="tres"; break; case 16: HoraTxt="quatre"; break; case 17: HoraTxt="cinc"; break; case 18: HoraTxt="sis"; break; case 19: HoraTxt="set"; break; case 20: HoraTxt="vuit"; break; case 21: HoraTxt="nou"; break; case 22: HoraTxt="deu"; break; case 23: HoraTxt="onze"; break; case 0: HoraTxt="dotze"; break; } switch(Minuts) { case 0: Txt = "Són "+Art2+""+HoraTxt+" en punt"; break; case 1: Txt = "Són "+Art2+""+HoraTxt+" i un minut"; break; case 2: Txt = "Són "+Art2+""+HoraTxt+" i dos minuts"; break; case 3: Txt = "Són "+Art2+""+HoraTxt+" i tres minuts"; break; case 4: Txt = "Són "+Art2+""+HoraTxt+" i quatre minuts"; break; case 5: Txt = "Són "+Art2+""+HoraTxt+" i cinc minuts"; break; case 6: Txt = "Són "+Art2+""+HoraTxt+" i sis minuts"; break; case 7: Txt = "Són mig quart de "+HoraTxt+""; break; case 8: Txt = "Són "+Art2+""+HoraTxt+" i vuit minuts"; break; case 9: Txt = "Són "+Art2+""+HoraTxt+" i nou minuts"; break; case 10: Txt = "Falten cinc minuts per un quart "+Art1+""+HoraTxt+""; break; case 11: Txt = "Falten quatra minuts per un quart "+Art1+""+HoraTxt+" "; break; case 12: Txt = "Falten tres minuts per un quart "+Art1+""+HoraTxt+""; break; case 13: Txt = "Falten dos minuts per un quart "+Art1+""+HoraTxt+""; break; case 14: Txt = "Falta un minut per un quart "+Art1+""+HoraTxt+""; break; case 15: Txt = "Són un quart "+Art1+""+HoraTxt+""; break; case 16: Txt = "Són un quart i un "+Art1+""+HoraTxt+""; break; case 17: Txt = "Són un quart i dos "+Art1+""+HoraTxt+""; break; case 18: Txt = "Són un quart i tres "+Art1+""+HoraTxt+""; break; case 19: Txt = "Són un quart i quatre "+Art1+""+HoraTxt+""; break; case 20: Txt = "Són un quart i cinc "+Art1+""+HoraTxt+""; break; case 21: Txt = "Són un quart i sis "+Art1+""+HoraTxt+""; break; case 22: Txt = "Són un quart i mig "+Art1+""+HoraTxt+""; break; case 23: Txt = "Falten set minuts per dos quarts "+Art1+""+HoraTxt+""; break; case 24: Txt = "Falten quatre minuts per dos quarts "+Art1+""+HoraTxt+""; break; case 25: Txt = "Falten cinc minuts per dos quarts "+Art1+""+HoraTxt+""; break; case 26: Txt = "Falten quatre minuts per dos quarts "+Art1+""+HoraTxt+""; break; case 27: Txt = "Falten tres minuts per dos quarts "+Art1+""+HoraTxt+""; break; case 28: Txt = "Falten dos minuts per dos quarts "+Art1+""+HoraTxt+""; break; case 29: Txt = "Falta un minut per dos quarts "+Art1+""+HoraTxt+""; break; case 30: Txt = "Són dos quarts "+Art1+""+HoraTxt+""; break; case 31: Txt = "Són dos quarts i un "+Art1+""+HoraTxt+""; break; case 32: Txt = "Són dos quarts i dos "+Art1+""+HoraTxt+""; break; case 33: Txt = "Són dos quarts i tres "+Art1+""+HoraTxt+""; break; case 34: Txt = "Són dos quarts i quatra "+Art1+""+HoraTxt+""; break; case 35: Txt = "Són dos quarts i cinc "+Art1+""+HoraTxt+""; break; case 36: Txt = "Són dos quarts i sis "+Art1+""+HoraTxt+""; break; case 37: Txt = "Són dos quarts i mig "+Art1+""+HoraTxt+""; break; case 38: Txt = "Falten set minuts per tres quarts "+Art1+""+HoraTxt+""; break; case 39: Txt = "Falten sis minuts per tres quarts "+Art1+""+HoraTxt+""; break; case 40: Txt = "Falten cinc minuts per tres quarts "+Art1+""+HoraTxt+""; break; case 41: Txt = "Falten quatre minuts per tres quarts "+Art1+""+HoraTxt+""; break; case 42: Txt = "Falten tres minuts per tres quarts "+Art1+""+HoraTxt+""; break; case 43: Txt = "Falten dos minuts per tres quarts "+Art1+""+HoraTxt+""; break; case 44: Txt = "Falta un minut per tres quarts "+Art1+""+HoraTxt+""; break; case 45: Txt = "Són tres quarts "+Art1+""+HoraTxt+""; break; case 46: Txt = "Són tres quarts i un "+Art1+""+HoraTxt+""; break; case 47: Txt = "Són tres quarts i dos "+Art1+""+HoraTxt+""; break; case 48: Txt = "Són tres quarts i tres "+Art1+""+HoraTxt+""; break; case 49: Txt = "Són tres quarts i quatre "+Art1+""+HoraTxt+""; break; case 50: Txt = "Són tres quarts i cinc "+Art1+""+HoraTxt+""; break; case 51: Txt = "Són tres quarts i sis "+Art1+""+HoraTxt+""; break; case 52: Txt = "Són tres quarts i mig "+Art1+""+HoraTxt+""; break; case 53: Txt = "Falten set minuts per "+Art2+""+HoraTxt+""; break; case 54: Txt = "Falten sis minuts per "+Art2+""+HoraTxt+""; break; case 55: Txt = "Falten cinc minuts per "+Art2+""+HoraTxt+""; break; case 56: Txt = "Falten quatre minuts per "+Art2+""+HoraTxt+""; break; case 57: Txt = "Falten tres minuts per "+Art2+""+HoraTxt+""; break; case 58: Txt = "Falten dos minuts per "+Art2+""+HoraTxt+""; break; case 59: Txt = "Falta un minut per "+Art2+""+HoraTxt+""; break; } return Txt }
script bash: hora_catalana.sh
/usr/bin/iconv -f UTF-8 -t ISO-8859-15 -o hora_catalana_tts_iso-8859-15.scm hora_catalana_tts.scm festival -b hora_catalana_tts_iso-8859-15.scm
Partim del script hora_catalana_tts.scm:
(voice_upc_ca_ona_hts)(SayText "Són tres quarts i un de cinc")
que selecciona la veu catalana escollida, i informa el que festival haurà de dir.
Però el script ha de convertir aquest fitxer al format ISO-8859-15, que és el que entén festival.
Finalment cridem a festival per fer sonar el missatge.
Funciona tant en el portàtil com a la RPi3, doncs la instal·lació de Festival és directa.
Mòdul de MagicMirror: MMM-HoraCatalana
Tot això ve perquè vull fer un mòdul per al Magic Mirror que faci sonar l'hora catalana. El meu Magic Mirror el vull dotar amb les funcionalitats STT i TTS (reconeixement de veu, i parla, tot en català). (TBD)
creat per Joan Quintana Compte, maig 2020 (COVID-19)