The `age` parameter is not useful as eSpeak does not use this when selecting voices. This is always set to `0` by TtsService.java. The `variant` parameter is not used to select the actual voice variant (from the `!v` directory) but to select the n^th matching voice from the list of matching voices. This is always set to select the first matching voice by TtsService.java.master
JNIEXPORT jboolean | JNIEXPORT jboolean | ||||
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeSetVoiceByProperties( | JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeSetVoiceByProperties( | ||||
JNIEnv *env, jobject object, jstring name, jstring languages, jint gender, jint age, | |||||
jint variant) { | |||||
JNIEnv *env, jobject object, jstring name, jstring languages, jint gender) { | |||||
const char *c_name = name ? env->GetStringUTFChars(name, NULL) : NULL; | const char *c_name = name ? env->GetStringUTFChars(name, NULL) : NULL; | ||||
const char *c_languages = languages ? env->GetStringUTFChars(languages, NULL) : NULL; | const char *c_languages = languages ? env->GetStringUTFChars(languages, NULL) : NULL; | ||||
voice_select.name = c_name; | voice_select.name = c_name; | ||||
voice_select.languages = c_languages; | voice_select.languages = c_languages; | ||||
voice_select.age = (int) age; | |||||
voice_select.gender = (int) gender; | voice_select.gender = (int) gender; | ||||
voice_select.variant = (int) variant; | |||||
const espeak_ERROR result = espeak_SetVoiceByProperties(&voice_select); | const espeak_ERROR result = espeak_SetVoiceByProperties(&voice_select); | ||||
return voices; | return voices; | ||||
} | } | ||||
public void setVoiceByProperties( | |||||
String name, String languages, int gender, int age, int variant) { | |||||
nativeSetVoiceByProperties(name, languages, gender, age, variant); | |||||
public void setVoiceByProperties(String name, String languages, int gender) { | |||||
nativeSetVoiceByProperties(name, languages, gender); | |||||
} | } | ||||
public void setRate(int rate) { | public void setRate(int rate) { | ||||
private native final String[] nativeGetAvailableVoices(); | private native final String[] nativeGetAvailableVoices(); | ||||
private native final boolean nativeSetVoiceByProperties( | |||||
String name, String languages, int gender, int age, int variant); | |||||
private native final boolean nativeSetVoiceByProperties(String name, String languages, int gender); | |||||
private native final boolean nativeSetRate(int rate); | private native final boolean nativeSetRate(int rate); | ||||
mCallback.start(mEngine.getSampleRate(), mEngine.getAudioFormat(), | mCallback.start(mEngine.getSampleRate(), mEngine.getAudioFormat(), | ||||
mEngine.getChannelCount()); | mEngine.getChannelCount()); | ||||
mEngine.setVoiceByProperties(null, mMatchingVoice.name, gender, 0, 0); | |||||
mEngine.setVoiceByProperties(null, mMatchingVoice.name, gender); | |||||
mEngine.setRate(rate); | mEngine.setRate(rate); | ||||
mEngine.setPitch(pitch); | mEngine.setPitch(pitch); | ||||
mEngine.synthesize(text, text.startsWith("<speak")); | mEngine.synthesize(text, text.startsWith("<speak")); |