android:TTS可以说广东话吗?

时间:2013-09-20 16:52:19

标签: android internationalization text-to-speech machine-translation

我正在学习编写一个旨在对给定字符串执行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);  
        }  
    }  

问题:

如果上面第3部分中的int result = mTts.setLanguage(Locale.US);设置为美国并且完全用英语读出“一二三”,那么一切都会好的。 (在上面的例子中,它将跳过所有的中文单词,只读出一两三个)

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

我想问一下

  1. 目前的TTS还不支持中文?我甚至更喜欢粤语而不是中文。

  2. 当我通过语音输入消息时,手机可以识别广东话(广东话)。实际上还有其他一些方法来执行TTS,输出是广东话吗?

  3. 谢谢!

6 个答案:

答案 0 :(得分:5)

1 - 当前版本的Google TTS引擎尚不支持广东话作为输出。普通话工作正常。

2 - Ekho是支持广东话的TTS引擎。

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

据我所知,JAVA中没有特定区域可以区分粤语或普通话,因为广东话是一种中国方言。 JAVA中的Locale仅指文字(简体或繁体)。

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

答案 1 :(得分:0)

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

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

其中mTtsTextToSpeech

的对象

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

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

int i = mTts.isLanguageAvailable(new Locale("zh_CN")); //for chinese simplified

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

答案 4 :(得分:0)

某些手机有可以与TTS一起使用的广东话语区。

尝试

new Locale("yue", "HK"); //yue for 粤语

答案 5 :(得分:-1)

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