Репозитории ALT
S: | 2.5-alt0.4 |
5.1: | 1.96-alt7 |
4.1: | 1.96-alt5.M41.1 |
4.0: | 1.96-alt2.6 |
3.0: | |
+backports: | 1.96-alt0.M30.1 |
Другие репозитории
Upstream: | 1.96-beta |
Группа :: Звук
Пакет: festival
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: 04-codec-add-alaw.diff
Скачать
Скачать
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