Пример #1
0
// 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;
}
Пример #3
0
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
}
Пример #4
0
  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;
  }
Пример #5
0
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;
}
Пример #6
0
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;
	}
}
Пример #7
0
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;
}
Пример #8
0
  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);
  }
Пример #9
0
//-----------------------------------------------------------------------------
// 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;
}
Пример #11
0
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;
}
Пример #12
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;
}
Пример #13
0
// 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;
}
Пример #14
0
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;
}