Android 文字转语音男声

IT小君   2021-10-22T05:02:01

我有一个有效的文本到语音,但我想知道当应用程序调用它来播放时,它会用男声代替女声吗?

评论(7)
IT小君

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

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

上下文 = 活动/应用

this=TextToSpeech.OnInitListener

tts.getVoices()列表中,按名称选择您想要的声音,如下所示:

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

注意:您需要_voiceName通过从tts.getVoices(). 例如:对于英国男性,它将是:“en-us-x-sfg#male_1-local”

2021-10-22T05:02:02   回复
IT小君

可以把声音变男声

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

//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);
}
2021-10-22T05:02:02   回复
IT小君

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

2021-10-22T05:02:02   回复
IT小君

你不能让 Android TextToSpeech 听起来像一个男性。如果将TextToSpeech.setPitch()更改为较低的值,例如 0.1,听起来会很糟糕。

您唯一的选择是尝试另一个文本到语音转换引擎,或者与女性的声音一起生活。

2021-10-22T05:02:02   回复
IT小君

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

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

2021-10-22T05:02:02   回复
IT小君

无论哪种方式,您都可以通过以下方式将您的 android Text-to-Speech 设置为 google TTS 服务:

  1. tts = new TextToSpeech(context, this, "com.google.android.tts"), 或者
  2. 安装新的男性(英语)语音并在android中默认设置。

希望能帮助到你。

2021-10-22T05:02:02   回复
IT小君

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

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

这里一个“功能”设置<String>的参数,但什么这些字符串实际上包含在发动机依赖和极其糟糕,记录和/或实施...并没有引擎使用此参数,我知道的描述性别。

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

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

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

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

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

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

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

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

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

2021-10-22T05:02:03   回复