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)