TTS: Hora Catalana

De wikijoan
Salta a la navegació Salta a la cerca

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)