void setVolumeRatio_mbrola(float value) { if (value == mbr_volume) return; mbr_volume = value; if (mbr_state != MBR_IDLE) return; /* * We have no choice but to kill and restart mbrola with * the new argument here. */ stop_mbrola(); init_MBR(mbr_voice_path); }
espeak_ng_STATUS LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int *srate) { // Load a phoneme name translation table from espeak-ng-data/mbrola int size; int ix; int *pw; FILE *f_in; char path[sizeof(path_home)+15]; mbrola_name[0] = 0; mbrola_delay = 0; mbr_name_prefix = 0; if (mbrola_voice == NULL) { samplerate = samplerate_native; SetParameter(espeakVOICETYPE, 0, 0); return ENS_OK; } if (!load_MBR()) return ENS_MBROLA_NOT_FOUND; sprintf(path, "%s/mbrola/%s", path_home, mbrola_voice); #ifdef PLATFORM_POSIX // if not found, then also look in // usr/share/mbrola/xx, /usr/share/mbrola/xx/xx, /usr/share/mbrola/voices/xx if (GetFileLength(path) <= 0) { sprintf(path, "/usr/share/mbrola/%s", mbrola_voice); if (GetFileLength(path) <= 0) { sprintf(path, "/usr/share/mbrola/%s/%s", mbrola_voice, mbrola_voice); if (GetFileLength(path) <= 0) sprintf(path, "/usr/share/mbrola/voices/%s", mbrola_voice); } } close_MBR(); #endif if (init_MBR(path) != 0) // initialise the required mbrola voice return ENS_MBROLA_VOICE_NOT_FOUND; setNoError_MBR(1); // don't stop on phoneme errors // read eSpeak's mbrola phoneme translation data, eg. en1_phtrans sprintf(path, "%s/mbrola_ph/%s", path_home, phtrans); size = GetFileLength(path); if ((f_in = fopen(path, "rb")) == NULL) { int error = errno; close_MBR(); return error; } MBROLA_TAB *new_mbrola_tab = (MBROLA_TAB *)realloc(mbrola_tab, size); if (new_mbrola_tab == NULL) { fclose(f_in); close_MBR(); return ENOMEM; } mbrola_tab = new_mbrola_tab; mbrola_control = Read4Bytes(f_in); pw = (int *)mbrola_tab; for (ix = 4; ix < size; ix += 4) *pw++ = Read4Bytes(f_in); fclose(f_in); setVolumeRatio_MBR((float)(mbrola_control & 0xff) /16.0f); samplerate = *srate = getFreq_MBR(); if (*srate == 22050) SetParameter(espeakVOICETYPE, 0, 0); else SetParameter(espeakVOICETYPE, 1, 0); strcpy(mbrola_name, mbrola_voice); mbrola_delay = 1000; // improve synchronization of events return ENS_OK; }