// Initializes the TTS engine and returns whether initialization succeeded tts_result TtsEngine::init(synthDoneCB_t synthDoneCBPtr) { // TODO Make sure that the speech data is loaded in // the directory /sdcard/espeak-data before calling this. int sampleRate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, 4096, "/sdcard", 0); if (sampleRate <= 0) { LOGI("eSpeak initialization failed!"); return TTS_FAILURE; } espeak_SetSynthCallback(eSpeakCallback); int speechRate = 140; espeak_ERROR err = espeak_SetParameter(espeakRATE, speechRate, 0); espeak_VOICE voice; memset( &voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first const char *langNativeString = "en-us"; //Default to US English voice.languages = langNativeString; voice.variant = 0; err = espeak_SetVoiceByProperties(&voice); ttsSynthDoneCBPointer = synthDoneCBPtr; return TTS_SUCCESS; }
JNIEXPORT jboolean JNICALL Java_com_googlecode_eyesfree_espeak_SpeechSynthesis_nativeSetVoiceByProperties( JNIEnv *env, jobject object, jstring name, jstring languages, jint gender, jint age, jint variant) { if (DEBUG) LOGV("%s", __FUNCTION__); const char *c_name = env->GetStringUTFChars(name, NULL); const char *c_languages = env->GetStringUTFChars(languages, NULL); espeak_VOICE voice_select; memset(&voice_select, 0, sizeof(espeak_VOICE)); voice_select.name = c_name; voice_select.languages = c_languages; voice_select.age = (int) age; voice_select.gender = (int) gender; voice_select.variant = (int) variant; const espeak_ERROR result = espeak_SetVoiceByProperties(&voice_select); env->ReleaseStringUTFChars(name, c_name); env->ReleaseStringUTFChars(languages, c_languages); if (result == EE_OK) return JNI_TRUE; else return JNI_FALSE; }
void QGCAudioWorker::init() { #if defined Q_OS_LINUX && !defined __android__ && defined QGC_SPEECH_ENABLED espeak_Initialize(AUDIO_OUTPUT_SYNCH_PLAYBACK, 500, NULL, 0); // initialize for playback with 500ms buffer and no options (see speak_lib.h) espeak_VOICE *espeak_voice = espeak_GetCurrentVoice(); espeak_voice->languages = "en-uk"; // Default to British English espeak_voice->identifier = NULL; // no specific voice file specified espeak_voice->name = "klatt"; // espeak voice name espeak_voice->gender = 2; // Female espeak_voice->age = 0; // age not specified espeak_SetVoiceByProperties(espeak_voice); #endif #if defined _MSC_VER && defined QGC_SPEECH_ENABLED if (FAILED(::CoInitialize(NULL))) { qDebug() << "ERROR: Creating COM object for audio output failed!"; } else { HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); if (FAILED(hr)) { qDebug() << "ERROR: Initializing voice for audio output failed!"; } } #endif }
long set_voice( const char* aName, const char* aLang=NULL, unsigned char aGender=0, unsigned char aAge=0, unsigned char aVariant = 0 ) { long result = 0; if (aLang || aGender || aAge || aVariant) { espeak_VOICE props = { 0 }; props.name = aName; props.languages = aLang; props.gender = aGender; props.age = aAge; props.variant = aVariant; result = espeak_SetVoiceByProperties(&props); } else { result = espeak_SetVoiceByName(aName); } // This way we don't need to allocate the name/lang strings to the heap. // Instead, we store the actual global voice. current_voice = espeak_GetCurrentVoice(); return result; }
static int spk_construct(volatile SpeechSynthesizer *spk, char **parameters) { char *data_path, *voicename, *punctlist; int result; spk->setVolume = spk_setVolume; spk->setRate = spk_setRate; spk->setPitch = spk_setPitch; spk->setPunctuation = spk_setPunctuation; spk->drain = spk_drain; logMessage(LOG_INFO, "eSpeak-NG version %s", espeak_Info(NULL)); data_path = parameters[PARM_PATH]; if (data_path && !*data_path) data_path = NULL; result = espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 0, data_path, 0); if (result < 0) { logMessage(LOG_ERR, "eSpeak-NG: initialization failed"); return 0; } voicename = parameters[PARM_VOICE]; if(!voicename || !*voicename) voicename = "en"; result = espeak_SetVoiceByName(voicename); if (result != EE_OK) { espeak_VOICE voice_select; memset(&voice_select, 0, sizeof(voice_select)); voice_select.languages = voicename; result = espeak_SetVoiceByProperties(&voice_select); } if (result != EE_OK) { logMessage(LOG_ERR, "eSpeak-NG: unable to load voice '%s'", voicename); return 0; } punctlist = parameters[PARM_PUNCTLIST]; if (punctlist && *punctlist) { wchar_t w_punctlist[strlen(punctlist) + 1]; int i = 0; while ((w_punctlist[i] = punctlist[i]) != 0) i++; espeak_SetPunctuationList(w_punctlist); } if (parameters[PARM_MAXRATE]) { int val = atoi(parameters[PARM_MAXRATE]); if (val > espeakRATE_MINIMUM) maxrate = val; } espeak_SetSynthCallback(SynthCallback); return 1; }
void dyn_cfg_callback(espeak_ros::EspeakConfig &cfg, uint32_t level) { // lock mutex before calling espeak functions boost::mutex::scoped_lock u_lock(mtx); std::string voice, dialect; voice = getVoiceName(cfg.voice); dialect = getDialectName(cfg.dialect); espeak_VOICE voice_select; std::memset(&voice_select,0,sizeof(voice_select)); voice_select.name = voice.c_str(); voice_select.languages = dialect.c_str(); voice_select.age = cfg.age; // 0=not specified, or age in years voice_select.gender = cfg.gender; // 0=none, 1=male, 2=female if (espeak_SetVoiceByProperties(&voice_select) != EE_OK) { ROS_ERROR("Could not set espeak voice properties. Aborting."); return; } ROS_INFO("Using voice %s", voice.c_str()); ROS_INFO("Using dialect %s", dialect.c_str()); if (espeak_SetParameter(espeakRATE, cfg.rate, 0) != EE_OK) { ROS_ERROR("Could not set espeak rate. Aborting."); return; } if (espeak_SetParameter(espeakVOLUME, cfg.volume, 0) != EE_OK) { ROS_ERROR("Could not set espeak volume. Aborting."); return; } if (espeak_SetParameter(espeakPITCH, cfg.pitch, 0) != EE_OK) { ROS_ERROR("Could not set espeak pitch. Aborting."); return; } if (espeak_SetParameter(espeakRANGE, cfg.range, 0) != EE_OK) { ROS_ERROR("Could not set espeak range. Aborting."); return; } if (espeak_SetParameter(espeakPUNCTUATION, espeak_PUNCT_TYPE(cfg.punctuation), 0) != EE_OK) { ROS_ERROR("Could not set espeak punctuation. Aborting."); return; } if (espeak_SetParameter(espeakCAPITALS, cfg.capitals, 0) != EE_OK) { ROS_ERROR("Could not set espeak capitals. Aborting."); return; } int wordgap = cfg.wordgap % 10; if (espeak_SetParameter(espeakWORDGAP, wordgap, 0) != EE_OK) { ROS_ERROR("Could not set espeak wordgap. Aborting."); return; } }
static espeak_ERROR set_voice(struct synth_t *s, char *voice) { espeak_ERROR rc; espeak_VOICE voice_select; rc = espeak_SetVoiceByName(voice); if (rc != EE_OK) { memset(&voice_select, 0, sizeof(voice_select)); voice_select.languages = voice; rc = espeak_SetVoiceByProperties(&voice_select); } if (rc == EE_OK) strcpy(s->voice, voice); return rc; }
void synth_(const char* aText, void* aCallback) { t_espeak_callback* cb = reinterpret_cast<t_espeak_callback*>(aCallback); espeak_SetSynthCallback(cb); espeak_SetParameter(espeakPITCH, pitch, 0); espeak_SetParameter(espeakRATE, rate, 0); if (current_voice) espeak_SetVoiceByProperties(current_voice); else espeak_SetVoiceByName("default"); espeak_Synth(aText, 0, 0, POS_CHARACTER, 0, 0, NULL, NULL); // Reset callback so other instances will work too. espeak_SetSynthCallback(NULL); }
//----------------------------------------------------------------------------- // InitSpeak - This function initializes the speech using the current file name // or parameters... //----------------------------------------------------------------------------- void RobotSpeak::InitSpeak() { espeak_ERROR err = EE_NOT_FOUND; // something other than OK... // See if this is the first time through if so register our release function. if (_bIDSDRSpeak == 0xff) _bIDSDRSpeak = SDRRegisterReleaseFunction(&_EndSpeak); // Tell our quick and dirty Sound registry stuff, that we want to be the current one... SDRSetCurrent(_bIDSDRSpeak); esoutput = AUDIO_OUTPUT_PLAYBACK; espeak_Initialize(esoutput, Buflength, path, Options ); // First see if someone registered a voice file name if (_pszVoiceFileName) { err = espeak_SetVoiceByName(_pszVoiceFileName); if (err != EE_OK) printf("Speak SetVoiceByProp failed %d\n", err); } else if (_pszVoiceLanguage) { espeak_VOICE voice; voice.name = NULL; voice.languages = _pszVoiceLanguage; voice.identifier= NULL; voice.age = 0; voice.gender = _bVoiceGender; voice.variant = 0; err = espeak_SetVoiceByProperties(&voice); if (err != EE_OK) printf("Speak SetVoiceByProp failed %d\n", err); } if (err != EE_OK) espeak_SetVoiceByName(g_szDefaultVoice); _fSpeakInit = true; }
JNIEXPORT jboolean JNICALL Java_com_googlecode_eyesfree_espeak_SpeechSynthesis_nativeSetLanguage( JNIEnv *env, jobject object, jstring language, jint variant) { if (DEBUG) LOGV("%s", __FUNCTION__); const char *c_language = env->GetStringUTFChars(language, NULL); const int len = strlen(c_language); char *lang_copy = (char *) calloc(len, sizeof(char)); strcpy(lang_copy, c_language); env->ReleaseStringUTFChars(language, c_language); espeak_VOICE voice; memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first voice.languages = lang_copy; voice.variant = (int) variant; const espeak_ERROR result = espeak_SetVoiceByProperties(&voice); if (result == EE_OK) return JNI_TRUE; else return JNI_FALSE; }
int main(int argc, char* argv[] ) { output = AUDIO_OUTPUT_PLAYBACK; int I, Run = 1, L; espeak_Initialize(output, Buflength, path, Options ); //espeak_SetVoiceByName(Voice); const char *langNativeString = "lt"; //Default to US English espeak_VOICE voice; memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first voice.languages = langNativeString; voice.name = "klatt"; voice.variant = 2; voice.gender = 1; espeak_SetVoiceByProperties(&voice); Size = strlen(text)+1; printf("Saying '%s'",text); espeak_Synth( text, Size, position, position_type, end_position, flags, unique_identifier, user_data ); espeak_Synchronize( ); printf("\n:Done\n"); return 0; }
ESpeak::ESpeak(QObject *parent) : QObject(parent), queueLength(0) { if (0 == refcount) { espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 100, 0, 0); espeak_VOICE voice; QString language = QLocale::system().languageToString(QLocale::system().language()); QByteArray languageData = language.toAscii(); languageData.prepend((char)0); languageData.append((char)0); QByteArray languages = QByteArray(1, (char)0); languageData += languages; voice.languages = languageData.data(); voice.name = 0; voice.gender = 2; voice.age = 20; espeak_SetVoiceByProperties(&voice); espeak_SetParameter(espeakRATE, 175, false); } ++refcount; }
// Language will be specified according to the Android conventions for // localization as documented here: // http://developer.android.com/guide/topics/resources/resources-i18n.html // // language will be a string of the form "xx" or "xx-rYY", where xx is a // two letter ISO 639-1 language code in lowercase and rYY is a two letter ISO // 3166-1-alpha-2 language code in uppercase preceded by a lowercase "r". // Note that the "-rYY" portion may be omitted if the region is unimportant. // tts_result TtsEngine::setLanguage( const char * lang, const char * country, const char * variant ) { LOGE("lang input param: %s country input param: %s", lang, country); char language[10]; int langIndex = -1; for (int i = 0; i < languageCount; i ++) { if (strcmp(lang, supportedLangIso3[i]) == 0) { langIndex = i; break; } } if (langIndex < 0) { /* The language isn't supported. */ LOGE("TtsEngine::setLanguage called with unsupported language"); return TTS_FAILURE; } strcpy(currentLang, lang); strcpy(currentCountry, country); strcpy(language, supportedLang[langIndex]); if (strcmp(language, "en") == 0){ if (strcmp(country, "USA") == 0){ strcpy(language, "en-rUS"); } if (strcmp(country, "GBR") == 0){ strcpy(language, "en-rGB"); } } if (strcmp(language, "es") == 0){ if (strcmp(country, "MEX") == 0){ strcpy(language, "es-rMX"); } } LOGE("Language: %s", language); espeak_VOICE voice; memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first voice.variant = 0; char espeakLangStr[6]; if ((strlen(language) != 2) && (strlen(language) != 6)){ LOGI("Error: Invalid language. Language must be in either xx or xx-rYY format."); return TTS_VALUE_INVALID; } if (strcmp(language, "en-rUS") == 0){ strcpy(espeakLangStr, "en-us"); } else if (strcmp(language, "en-rGB") == 0){ strcpy(espeakLangStr, "en-uk"); } else if (strcmp(language, "es-rMX") == 0){ strcpy(espeakLangStr, "es-la"); } else if (strcmp(language, "zh-rHK") == 0){ strcpy(espeakLangStr, "zh"); voice.variant = 5; } else { espeakLangStr[0] = language[0]; espeakLangStr[1] = language[1]; espeakLangStr[2] = 0; // Bail out and do nothing if the language is not supported by eSpeak if ((strcmp(language, "af") != 0) && (strcmp(language, "bs") != 0) && (strcmp(language, "zh") != 0) && (strcmp(language, "hr") != 0) && (strcmp(language, "cz") != 0) && (strcmp(language, "nl") != 0) && (strcmp(language, "en") != 0) && (strcmp(language, "eo") != 0) && (strcmp(language, "fi") != 0) && (strcmp(language, "fr") != 0) && (strcmp(language, "de") != 0) && (strcmp(language, "el") != 0) && (strcmp(language, "hi") != 0) && (strcmp(language, "hu") != 0) && (strcmp(language, "is") != 0) && (strcmp(language, "id") != 0) && (strcmp(language, "it") != 0) && (strcmp(language, "ku") != 0) && (strcmp(language, "la") != 0) && (strcmp(language, "mk") != 0) && (strcmp(language, "no") != 0) && (strcmp(language, "pl") != 0) && (strcmp(language, "pt") != 0) && (strcmp(language, "ro") != 0) && (strcmp(language, "ru") != 0) && (strcmp(language, "sr") != 0) && (strcmp(language, "sk") != 0) && (strcmp(language, "es") != 0) && (strcmp(language, "sw") != 0) && (strcmp(language, "sv") != 0) && (strcmp(language, "ta") != 0) && (strcmp(language, "tr") != 0) && (strcmp(language, "vi") != 0) && (strcmp(language, "cy") != 0) ){ LOGI("Error: Unsupported language."); return TTS_PROPERTY_UNSUPPORTED; } // Use American English as the default English if (strcmp(language, "en") == 0) { strcpy(espeakLangStr, "en-us"); } } voice.languages = espeakLangStr; espeak_ERROR err = espeak_SetVoiceByProperties(&voice); currentLanguage = new char [strlen(language)]; strcpy(currentLanguage, language); return TTS_SUCCESS; }
int main( int argc, char** argv ) { espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 0, NULL, 0); ros::init(argc, argv, "espeak_node"); ros::NodeHandle n; ros::NodeHandle priv_n("~"); // for list of voices, run "espeak --voices" // voices: "brazil", "default", "english", "lancashire", // "english-rp", "english-wmids", "english-us", "en-scottish" std::string voice_name; // dialects: "pt-br", "en", "en-uk", "en-uk-north", // "en-uk-rp", "en-uk-wmids", "en-us", "en-sc" std::string dialect; espeak_VOICE voice_select; // See speak_lib.h for details and range of the parameters below int rate, volume, pitch, range, punctuation; int voice_num, dialect_num, capitals, wordgap, age, gender; // Fetch default parameters rate = espeak_GetParameter(espeakRATE, 0); volume = espeak_GetParameter(espeakVOLUME, 0); pitch = espeak_GetParameter(espeakPITCH, 0); range = espeak_GetParameter(espeakRANGE, 0); punctuation = espeak_GetParameter(espeakPUNCTUATION, 0); capitals = espeak_GetParameter(espeakCAPITALS, 0); wordgap = espeak_GetParameter(espeakWORDGAP, 0); voice_num = 1; dialect_num = 1; // Fetch (and set if param could not be retrieved) ROS parameters if (priv_n.getParam("voice", voice_num) == false) { priv_n.setParam("voice", voice_num); } if (priv_n.getParam("dialect", dialect_num) == false) { priv_n.setParam("dialect", dialect_num); } if (priv_n.getParam("rate", rate) == false) { priv_n.setParam("rate", rate); } if (priv_n.getParam("volume", volume) == false) { priv_n.setParam("volume", volume); } if (priv_n.getParam("pitch", pitch) == false) { priv_n.setParam("pitch", pitch); } if (priv_n.getParam("punctuation", punctuation) == false) { priv_n.setParam("punctuation", punctuation); } if (priv_n.getParam("capitals", capitals) == false) { priv_n.setParam("capitals", capitals); } if (priv_n.getParam("wordgap", wordgap) == false) { priv_n.setParam("wordgap", wordgap); } priv_n.param("age", age, int(0)); priv_n.param("gender", gender, int(2)); if (age < 0 || age > 100) { age = 0; } if (gender < 0 || gender > 2) { gender = 2; } voice_name = getVoiceName(voice_num); dialect = getDialectName(dialect_num); std::memset(&voice_select,0,sizeof(voice_select)); voice_select.name = voice_name.c_str(); voice_select.languages = dialect.c_str(); voice_select.age = age; // 0=not specified, or age in years voice_select.gender = gender; // 0=none, 1=male, 2=female // set espeak parameters //if (espeak_SetVoiceByName(voice_name.c_str()) != EE_OK) { // ROS_ERROR("Could not set espeak voice. Aborting."); // return 1; //} if (espeak_SetVoiceByProperties(&voice_select) != EE_OK) { ROS_ERROR("Could not set espeak voice properties. Aborting."); return 1; } //ROS_INFO("Using voice %s", voice_name.c_str()); //ROS_INFO("Using dialect %s", dialect.c_str()); if (rate < 80 || rate > 450) { ROS_INFO("Parameter rate = %d out of range, using default value", rate); } else { if (espeak_SetParameter(espeakRATE, rate, 0) != EE_OK) { ROS_ERROR("Could not set espeak rate. Aborting."); return 1; } } if (volume < 0 || volume > 200) { ROS_INFO("Parameter volume = %d out of range, using default value", volume); } else { if (espeak_SetParameter(espeakVOLUME, volume, 0) != EE_OK) { ROS_ERROR("Could not set espeak volume. Aborting."); return 1; } } if (pitch < 0 || pitch > 100) { ROS_INFO("Parameter pitch = %d out of range, using default value", pitch); } else { if (espeak_SetParameter(espeakPITCH, pitch, 0) != EE_OK) { ROS_ERROR("Could not set espeak pitch. Aborting."); return 1; } } if (range < 0 || range > 100) { ROS_INFO("Parameter range = %d out of range, using default value", range); } else { if (espeak_SetParameter(espeakRANGE, range, 0) != EE_OK) { ROS_ERROR("Could not set espeak range. Aborting."); return 1; } } if (punctuation < 0 || punctuation > 2) { ROS_INFO("Parameter punctuation out of range, using default value"); } else { if (espeak_SetParameter(espeakPUNCTUATION, espeak_PUNCT_TYPE(punctuation), 0) != EE_OK) { ROS_ERROR("Could not set espeak punctuation. Aborting."); return 1; } } if (capitals < 0 || capitals > 3) { ROS_INFO("Parameter capitals out of range, using default value"); } else { if (espeak_SetParameter(espeakCAPITALS, capitals, 0) != EE_OK) { ROS_ERROR("Could not set espeak capitals. Aborting."); return 1; } } if (wordgap < 0 || wordgap > 1000 || wordgap % 10 != 0) { ROS_INFO("Parameter wordgap out of range, using default value"); } else { if (espeak_SetParameter(espeakWORDGAP, wordgap, 0) != EE_OK) { ROS_ERROR("Could not set espeak wordgap. Aborting."); return 1; } } dynamic_reconfigure::Server<espeak_ros::EspeakConfig> server; dynamic_reconfigure::Server<espeak_ros::EspeakConfig>::CallbackType f; f = boost::bind(&dyn_cfg_callback, _1, _2); server.setCallback(f); ros::Subscriber sub = n.subscribe("/espeak_node/speak_line", 20, espeak_callback); ros::spin(); while (n.ok()); return 0; }