Android文字转语音男声

时间:2012-03-22 01:28:45

标签: java android text-to-speech

我有一个正常的文字说话,但我想知道当应用程序调用它而不是女声时,它会做一个男性的声音吗?

7 个答案:

答案 0 :(得分:9)

现在可以使用男/女声音并动态地从App UI更改它。像这样定义TTS(在构造函数中添加google tts引擎):

tts = new TextToSpeech(context, this, "com.google.android.tts");
  

contex = activity / app

     

this = TextToSpeech.OnInitListener

tts.getVoices()列表中,按照以下名称选择所需的语音:

for (Voice tmpVoice : tts.getVoices()) {
        if (tmpVoice.getName().equals(_voiceName)) {
            return tmpVoice;
            break;
        }
}

N.B:你需要通过从_voiceName获取硬编码的voice_name来设置tts.getVoices()。例如:对于英国男性,它将是:“en-us-x-sfg#male_1-local”

答案 1 :(得分:1)

这取决于底层的TTS引擎。有些是可配置的,有不同的声音(男性,女性等),有些只有一个声音。在任何情况下,您无法通过应用程序控制此操作,用户必须从“设置”应用程序更改TTS引擎设置。您只能指示他们安装特定的引擎,并设置您的应用程序以使用它。

答案 2 :(得分:1)

你不能让Android TextToSpeech听起来像男性。如果您将TextToSpeech.setPitch()值更改为低,如0.1,则听起来非常糟糕。

您唯一的选择是尝试使用另一个文字转语音引擎,或者使用女声发声。

答案 3 :(得分:1)

可以将声音变成男性。设置在onCreate()tts.setEngineByname("com.google.android.tts"),并在google tts服务中设置google tts服务默认设置,并在google tts服务中安装男声。

像这样你可以使用任何第三方android tts服务并检查设备。或者要求安装。

答案 4 :(得分:1)

可以将语音转换为男性

这是我的代码,希望对您有帮助!

//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);
}

答案 5 :(得分:0)

无论哪种方式,您都可以通过以下方式将Android文本转语音设置为Google TTS服务:

  1. tts = new TextToSpeech(context, this, "com.google.android.tts")
  2. 安装新的男声(英语)声音并默认设置在android。
  3. 希望它有所帮助。

答案 6 :(得分:0)

与之前的一些答案相反,性别不是 Voice 对象的参数(甚至不是“特征”)。

如您所见...截至 2021 年 5 月,没有“isMale”布尔参数。

一个“功能”Set 参数,但这些字符串实际包含的内容取决于引擎,并且记录和/或实现极差......并且没有引擎使用此参数描述性别我知道的。

TextToSpeech.setVoice() 的设计使得设置的 Voice 必须与之前由 TextToSpeech.getVoices() 返回的 Voice 对象之一完全匹配/实例——这不是一种方法以某种方式创建/请求新的自定义语音或尝试混合和匹配参数。(这并不是说某些引擎不会尝试对您尝试发送给它的不存在的新语音进行最佳近似).

即使实现了性别,语音参数也不是设计为可独立设置的。

Voice 对象是引擎可以使用 getVoices() 描述其可用语音的一种方式——它们不是语音本身。

据我所知,除了语音引擎开发人员之外,Voice 类的构造函数对任何人都没有用处。

所有这一切意味着除非特定引擎的作者选择将“男性”或“女性”作为声音名称的子字符串,否则您无法确定声音听起来是男性还是女性而不是先听。

因此,为了控制语音输出是否“是”男性/女性,以下所有条件都必须为真:

  1. 您已经知道要查找的唯一语音名称(字符串)
  2. 包含该语音的引擎已安装在用户设备上(不受您的控制)
  3. 该引擎的安装版本足够新,可以包含该语音(不在您的控制范围内)
  4. 该引擎的安装版本不是太新,因此不再包含该声音(不在您的控制范围内)
  5. 用户安装了特定的声音(不在您的控制范围内)
  6. 如果未安装语音,则用户已连接到互联网(不在您的控制范围内)

PS - 即使你认为你找到了一个男性声音,它实际上也可能是一个听起来像男性的女性。 :)

PPS - 您可以改用云服务来消除所有设备的不可预测性。