Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37510182
en ru br
ALT Linux repos
S:2.5-alt0.4
5.0: 1.96-alt6
4.1: 1.96-alt5.M41.1
4.0: 1.96-alt2.6
3.0:
+backports:1.96-alt0.M30.1

Other repositories
Upstream:1.96-beta

Group :: Sound
RPM: festival

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

Patch: 04-codec-add-alaw.diff
Download


This patch is part of a series of patches for festival for
Debian GNU/Linux, to allow alaw output (asterisk interoperability)
--- a/src/modules/diphone/diphone.cc
+++ b/src/modules/diphone/diphone.cc
@@ -180,6 +180,8 @@
 	db->group_encoding = di_raw;
     else if (streq(db->group_encoding_str,"ulaw"))
 	db->group_encoding = di_ulaw;
+    else if (streq(db->group_encoding_str,"alaw"))
+	db->group_encoding = di_alaw;
     else
     {
 	cerr << "Diphone: unknown group encoding" << endl;
@@ -218,7 +220,7 @@
     {
 	wfree(db->indx[0]->diph);  // ptr to the whole diphname table
 	wfree(db->allsignal);
-	wfree(db->allulawsignal);
+	wfree(db->allualawsignal);
 	wfree(db->allframes);
     }
     for (i=0; i < db->nindex; i++)
@@ -275,7 +277,7 @@
     db->alternates_before = NIL;
     db->alternates_after = NIL;
     db->allsignal = 0;
-    db->allulawsignal = 0;
+    db->allualawsignal = 0;
     db->offsets = 0;
     db->gfd = 0;
     db->default_diphone = 0;
--- a/src/modules/diphone/diphone.h
+++ b/src/modules/diphone/diphone.h
@@ -41,7 +41,7 @@
 
 enum di_sigaccess_t {di_direct, di_dynamic, di_ondemand};
 enum di_db_type_t {di_pcm, di_lpc};
-enum di_group_encode_t {di_raw, di_ulaw };
+enum di_group_encode_t {di_raw, di_ulaw, di_alaw };
 enum di_group_t {di_grouped, di_ungrouped};
 
 typedef struct {
@@ -109,7 +109,7 @@
     int lpc_pitch_synch;    /* True if lpc frames are pitch synchronous */
 
     short *allsignal;                /* used in group files */
-    unsigned char *allulawsignal;
+    unsigned char *allualawsignal;
     float *allframes;
     short *allframesshort;
 
--- a/src/modules/donovan/t2s.h
+++ b/src/modules/donovan/t2s.h
@@ -261,10 +261,6 @@
 /* transcribe.c  */
 void transcribe(CONFIG *config, LING_LIST *ling_list);
 
-/* ulaw.c  */
-unsigned char linear2ulaw(int sample);
-int ulaw2linear(unsigned char ulawbyte);
-
 /* utils.c  */
 char **split(char *in);
 void tidy_split(char **root);
--- a/src/modules/diphone/di_io.cc
+++ b/src/modules/diphone/di_io.cc
@@ -415,6 +415,16 @@
 		ulaw_to_short(ulaw,db->vox[i]->signal,db->vox[i]->nsamples);
 		wfree(ulaw);
 	    }
+	    else if (db->group_encoding == di_alaw)
+	    {
+		unsigned char *alaw = 
+		    walloc(unsigned char,db->vox[i]->nsamples);
+		db->vox[i]->signal = walloc(short,db->vox[i]->nsamples);
+		fseek(db->gfd,db->gsignalbase+(db->offsets[i]),SEEK_SET);
+		fread(alaw,sizeof(unsigned char),db->vox[i]->nsamples,db->gfd);
+		alaw_to_short(alaw,db->vox[i]->signal,db->vox[i]->nsamples);
+		wfree(alaw);
+	    }
 	    else
 	    {
 		cerr << "Diphone: unknown group type" << endl;
@@ -800,8 +810,13 @@
 	}
 	else if (db->group_encoding == di_ulaw)
 	{
-	    db->allulawsignal = walloc(unsigned char,totsamples);
-	    fread(db->allulawsignal,sizeof(unsigned char),totsamples,db->gfd);
+	    db->allualawsignal = walloc(unsigned char,totsamples);
+	    fread(db->allualawsignal,sizeof(unsigned char),totsamples,db->gfd);
+	}
+	else if (db->group_encoding == di_alaw)
+	{
+	    db->allualawsignal = walloc(unsigned char,totsamples);
+	    fread(db->allualawsignal,sizeof(unsigned char),totsamples,db->gfd);
 	}
     }
     else
@@ -821,7 +836,13 @@
 	    else if (db->group_encoding == di_ulaw)
 	    {
 		db->vox[i]->signal = walloc(short,samp_counts[i]);
-		ulaw_to_short(&db->allulawsignal[sample_offset],
+		ulaw_to_short(&db->allualawsignal[sample_offset],
+			      db->vox[i]->signal,samp_counts[i]);
+	    }
+	    else if (db->group_encoding == di_alaw)
+	    {
+		db->vox[i]->signal = walloc(short,samp_counts[i]);
+		alaw_to_short(&db->allualawsignal[sample_offset],
 			      db->vox[i]->signal,samp_counts[i]);
 	    }
 	    else
@@ -838,7 +859,7 @@
 	sample_offset += samp_counts[i];
     }
     if (db->sig_access_type != di_direct)
-	if (db->group_encoding == di_ulaw)
+	if (db->group_encoding == di_ulaw || db->group_encoding == di_alaw)
 	    fseek(db->gfd,(long)sample_offset,SEEK_CUR);
 	else
 	    fseek(db->gfd,(long)sample_offset*sizeof(short),SEEK_CUR);
@@ -867,7 +888,7 @@
 	if (db->swap) 
 	    swap_bytes_float(db->allframes,totframes*db->lpc_order);
     }
-    else if (db->group_encoding == di_ulaw) // its as shorts
+    else if (db->group_encoding == di_ulaw || db->group_encoding == di_alaw) // its as shorts
     {
 	db->allframesshort = walloc(short,totframes*db->lpc_order);
 	fread(db->allframesshort,sizeof(short),
@@ -885,7 +906,7 @@
 	    for (j=0;j<db->lpc[i]->nframes;j++)
 		db->lpc[i]->f[j] = 
 		    &db->allframes[(frame_offset+j)*db->lpc_order];
-	else if (db->group_encoding == di_ulaw)
+	else if (db->group_encoding == di_ulaw || db->group_encoding == di_alaw)
 	{
 	    int fixedpoint = FALSE;
 	    if (siod_get_lval("lpc_fixedpoint",NULL) != NIL)
@@ -1031,6 +1052,13 @@
 	    fwrite(ulaw,sizeof(unsigned char),db->vox[i]->nsamples,fd);
 	    wfree(ulaw);
 	}
+	else if (db->group_encoding == di_alaw)
+	{
+	    unsigned char *alaw = walloc(unsigned char,db->vox[i]->nsamples);
+	    short_to_alaw(db->vox[i]->signal,alaw,db->vox[i]->nsamples);
+	    fwrite(alaw,sizeof(unsigned char),db->vox[i]->nsamples,fd);
+	    wfree(alaw);
+	}
 	else
 	{
 	    cerr << "Diphone: unknown group type for dumping" << endl;
@@ -1058,7 +1086,7 @@
 		for (j=0; j<db->lpc[i]->nframes; j++)
 		    fwrite(db->lpc[i]->f[j],sizeof(float),db->lpc_order,fd);
 	    }
-	    else if (db->group_encoding == di_ulaw) // saved as shorts
+	    else if (db->group_encoding == di_ulaw || db->group_encoding == di_alaw) // saved as shorts
 	    {   
 		short *sh = new short[db->lpc_order];
 		
--- a/examples/text2wave.sh
+++ b/examples/text2wave.sh
@@ -50,7 +50,7 @@
   Options
   -mode <string>  Explicit tts mode.
   -o ofile        File to save waveform (default is stdout).
-  -otype <string> Output waveform type: ulaw, snd, aiff, riff, nist etc.
+  -otype <string> Output waveform type: alaw, ulaw, snd, aiff, riff, nist etc.
                   (default is riff)
   -F <int>        Output frequency.
   -scale <float>  Volume factor
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin