2

我正在学习编写一个旨在对给定字符串执行 TTS 的应用程序,并尝试了一个从 web 修改的示例:

编码如下:

// setup TTS part 1
            mTts = new TextToSpeech(Lesson2_dialog_revision_simple.this, this);  // TextToSpeech.OnInitListener
            speakBtn.setOnClickListener(new OnClickListener() 
            {         
                public void onClick(View v) 
                {  
                    StringTokenizer loveTokens = new StringTokenizer("他們 one two是 three ",",.");  
                    int i = 0;  
                    loveArray = new String[loveTokens.countTokens()];  
                    while(loveTokens.hasMoreTokens())  
                    {  
                        loveArray[i++] = loveTokens.nextToken();  
                    }  
                    speakText();  
                }  
            });        
    }

// setup TTS part 2 
    @Override
    public void onUtteranceCompleted(String utteranceId) 
    {  
        Log.v(TAG, "Get completed message for the utteranceId " + utteranceId);  
        lastUtterance = Integer.parseInt(utteranceId);  
    }  

// setup TTS part 3 
    @Override
    public void onInit(int status) 
    {  
        if(status == TextToSpeech.SUCCESS)  
        {  
            int result = mTts.setLanguage(Locale.CHINESE);  // <====== set speech location
            if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
            {  
                Toast.makeText(Lesson2_dialog_revision_simple.this, "Language is not supported", Toast.LENGTH_LONG).show();
                speakBtn.setEnabled(false);  
            }  
            else  
            {  
                speakBtn.setEnabled(true);  
                mTts.setOnUtteranceCompletedListener(this);  
            }  
        }     
    }  

// setup TTS part 4 
    private void speakText()  
    {  
        lastUtterance++;  
        if(lastUtterance >= loveArray.length)  
        {  
            lastUtterance = 0;  
        }  
        Log.v(TAG, "the begin utterance is " + lastUtterance);  
        for(int i = lastUtterance; i < loveArray.length; i++)  
        {  
            params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.valueOf(i));  
            mTts.speak(loveArray[i], TextToSpeech.QUEUE_ADD, params);  
        }  
    }  

问题:

int result = mTts.setLanguage(Locale.US); 如果上面的第 3 部分设置为 US 并完美地读出英文“一二三”,则一切正常。(在上面的例子中,它会跳过所有的中文单词,只读出一二三)

但是,如果我通过将语言设置为 setLanguage(Locale.CHINESE) 来更改字符串以读出中文,它会立即提示“不支持语言”。

我想问一下

  1. 现在的TTS还不支持中文?我更喜欢粤语而不是中文。

  2. 当我通过语音(粤语)输入信息时,手机能够识别粤语。实际上是否有其他方式来执行 TTS 输出为粤语?

谢谢!!

4

6 回答 6

5

1 - 当前版本的谷歌 TTS 引擎还不支持粤语作为输出。普通话很好用。

2 - Ekho是一个支持粤语的 TTS 引擎。

您可能想尝试一下我开发的与 Ekho 和 Google TTS 引擎一起使用的 TTS 应用程序:Voice Out TTS

据我所知,JAVA 中没有特定的语言环境来区分粤语或普通话,因为粤语是中国方言。JAVA 中的语言环境仅指文字(简体或繁体)。

例如,您可以用粤语或普通话阅读繁体中文的字符串。

于 2013-11-28T01:34:45.543 回答
0

@Pearmak:您可以检查设备支持的语言

int i = mTts.isLanguageAvailable(Locale.ENGLISH);

mTts对象在哪里TextToSpeech

如果您获得 的值,i >=0则您的设备支持该语言,否则不支持。

您还可以传递语言区域设置字符串。

int i = mTts.isLanguageAvailable(new Locale("zh_CN")); //for chinese simplified
于 2014-03-20T07:59:52.643 回答
0

粤语,普通话的微型中文文本到语音(TTS)合成引擎,用于离线嵌入式系统。悦体积极小,离线,独立,PCM音频输出,无需服务器或网络连接。混合文本输入的合成语音自然度高,同一文本输入的粤语和普通话语音合成,耶鲁、粤拼和拼音罗马化。该引擎可以持续为长文本产生和播放语音,文本的长度不受限制。它内置智能检测器,可以处理任何繁体中文、简体中文、英文、数字和标点符号、符号混合文本输入。悦是用ANSI C编写的,不依赖第三方库,运行在ARM,AVR嵌入式系统,如手表,玩具,机器人和iPhone,Android,......移动平台,当然普通桌面,电子书,报纸阅读者,讲故事的人。悦可以加载到内存并嵌入到其他程序中,由于体积极小,非常适合嵌入式系统,也适合桌面操作系统。该引擎可以绑定大量编程语言。

链接:http ://www.sevenuc.com/en/tts.html

于 2014-11-01T06:20:11.377 回答
0

Google TTS 最近增加了对粤语(以及普通话)的支持。http://www.androidpolice.com/2015/07/24/google-tts-now-supports-four-new-languages-include-cantonese-and-mandarin/

于 2015-08-01T10:40:10.250 回答
0

某些手机​​具有可用于 TTS 的粤语区域设置。

尝试

new Locale("yue", "HK"); //yue for 粤语
于 2017-08-07T09:30:26.473 回答
-1

将系统语言设置为粤语后,您就可以使用setLanguage(Locale.getDefault()).

于 2016-01-05T06:31:08.823 回答