【发布时间】:2012-04-06 14:22:37
【问题描述】:
我有一个工作的文本到语音,但我想知道当应用程序调用它来播放它时,它会代替女性声音而不是男性声音?
【问题讨论】:
-
参考我的答案,它对我有用。我可以为男性设置声音。stackoverflow.com/questions/36681232/android-tts-male-voices/…
标签: java android text-to-speech
我有一个工作的文本到语音,但我想知道当应用程序调用它来播放它时,它会代替女性声音而不是男性声音?
【问题讨论】:
标签: java android text-to-speech
现在可以使用男声/女声并从 App UI 动态更改。像这样定义 TTS(在构造函数中添加 google tts 引擎):
tts = new TextToSpeech(context, this, "com.google.android.tts");
contex = 活动/应用程序
this=TextToSpeech.OnInitListener
从tts.getVoices() 列表中,通过名称选择您想要的声音,如下所示:
for (Voice tmpVoice : tts.getVoices()) {
if (tmpVoice.getName().equals(_voiceName)) {
return tmpVoice;
break;
}
}
注意:你需要通过从tts.getVoices() 获取硬编码的voice_name 来设置_voiceName。例如:对于英国男性,它将是:“en-us-x-sfg#male_1-local”
【讨论】:
可以变男声
这是我的代码,希望对你有帮助!
//onCreate
T2S= new TextToSpeech(testApp.getInstance().getApplicationContext(), this, "com.google.android.tts");
Set<String> a=new HashSet<>();
a.add("male");//here you can give male if you want to select male voice.
Voice v=new Voice("en-us-x-sfg#male_2-local",new Locale("en","US"),400,200,true,a);
T2S.setVoice(v);
T2S.setSpeechRate(0.8f);
在 Activity 上实现 TextToSpeech.OnInitListener。
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
Set<String> a=new HashSet<>();
a.add("male");//here you can give male if you want to select male voice.
//Voice v=new Voice("en-us-x-sfg#female_2-local",new Locale("en","US"),400,200,true,a);
Voice v=new Voice("en-us-x-sfg#male_2-local",new Locale("en","US"),400,200,true,a);
T2S.setVoice(v);
T2S.setSpeechRate(0.8f);
// int result = T2S.setLanguage(Locale.US);
int result = T2S.setVoice(v);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "This Language is not supported");
} else {
// btnSpeak.setEnabled(true);
speakOut(mMessageVoice);
}
} else {
Log.e("TTS", "Initilization Failed!");
}
}
并添加此功能:
private void speakOut(String message) {
t1.speak(message, TextToSpeech.QUEUE_FLUSH, null);
}
【讨论】:
这取决于底层的 TTS 引擎。有些是可配置的并且有不同的声音(男性、女性等),有些只有一种声音。在任何情况下,您都无法从您的应用程序控制这一点,用户必须从“设置”应用程序更改 TTS 引擎设置。您只能指示他们安装特定引擎,并设置您的应用程序以使用它。
【讨论】:
您不能让 Android TextToSpeech 听起来像男性。如果您将TextToSpeech.setPitch() 的值更改为较低的值,例如 0.1,听起来会很糟糕。
您唯一的选择是尝试其他文本转语音引擎,或者使用女性声音。
【讨论】:
可以将声音变成男性。设置在onCreate():tts.setEngineByname("com.google.android.tts") 并在文本到语音设置中默认设置谷歌 tts 服务并在谷歌 tts 服务中安装男声。
像这样您可以使用任何第三方 android tts 服务并检查设备。或要求安装。
【讨论】:
无论哪种方式,您都可以通过以下方式将您的 android Text-to-Speech 设置为 google TTS 服务:
tts = new TextToSpeech(context, this, "com.google.android.tts"),或希望对你有帮助。
【讨论】:
与之前的一些答案相反,性别不是Voice 对象的参数(甚至不是“特征”)。
如您所见...截至 2021 年 5 月,没有“isMale”布尔参数。
有一个“功能”Set
TextToSpeech.setVoice() 的设计使得被设置的 Voice 必须与之前由 TextToSpeech.getVoices() 返回的 Voice 对象之一完全匹配/实例——这不是一种方法以某种方式创建/请求新的自定义语音或尝试混合和匹配参数。(这并不是说某些引擎不会尝试对您尝试发送给它的不存在的新语音做出最佳近似)。
即使实现了性别,Voice 参数也并非设计为可独立设置。
Voice 对象是引擎可以使用 getVoices() 描述其可用声音的一种方式——它们本身并不是声音。
据我所知,Voice 类的构造函数对语音引擎开发人员以外的任何人都没有用处。
所有这一切意味着,除非特定引擎的作者选择将“男性”或“女性”作为声音名称的子字符串,否则您无法确定声音听起来是男性还是女性而不是先听。
因此,为了控制语音输出“是”男性还是女性,以下所有条件都必须为真:
PS - 即使你认为你找到了一个男声,它实际上也可能是一个对你来说听起来只是男性的女性。 :)
PPS - 您可以改用云服务来消除所有设备的不可预测性。
【讨论】: