使用API 21的TextToSpeech技术

22

有人能帮我使用API 21的TTS吗?所有可用的示例都已在版本21中弃用。

这是我的代码,在最后一行出现错误:

Calendar cal = Calendar.getInstance();
                    cal.getTime();
                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
                    String text = sdf.toString();
                    btn.setText("Ouvir as Horas");

                    TextToSpeech tts = new TextToSpeech(NightClock.this,(TextToSpeech.OnInitListener) NightClock.this);
                    tts.setLanguage(Locale.US);
                    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);

在Android开发者文档中提到这个方法已经被弃用并替换为:

speak(CharSequence text, int queueMode, Bundle params, String utteranceId) 这个方法从API级别21开始已经被替换为speak(CharSequence, int, Bundle, String)。

能有人帮忙编写我的应用程序吗?

6个回答

44

我搜索了多个网站。最终,我认为我可以得到您的问题的答案...

不要直接调用tts.speak(),请加入以下if-else语句。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    ttsGreater21(text);
} else {
    ttsUnder20(text);
}
然后声明ttsGreater21()和ttsUnder20()如下。
@SuppressWarnings("deprecation")
private void ttsUnder20(String text) {
    HashMap<String, String> map = new HashMap<>();
    map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void ttsGreater21(String text) {
    String utteranceId=this.hashCode() + "";
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
}

我已确认上述代码可在Genymotion VM Android 5.0和Android 4.4.4上运行。


7
tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null);

试一下这个。


构建应用程序后,Android Studio 报告说该语法仅适用于 API 21。因此,也许它可以工作,但我的设备不是棒棒糖,我无法测试它。那么问题就在于如何创建一个与 API 20 和 API 21 兼容的 TextToSpeech 应用程序。 - Jose Borges
使用已弃用的方法来尝试在模拟器中运行应用程序,查看它显示了什么。 - Aditya
两种方法都会导致它崩溃。 - Jose Borges
顺便说一下,我的电脑需要1个小时才能打开模拟器。 - Jose Borges
我认为我有一个解决方案。就是加入一个 if 条件来检测 API 级别,然后触发不同的语法。 - Jose Borges
你得到了一个回应作为答案,显然。 - EpicPandaForce

5
所以我猜这就是诀窍:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    tts.speak("12 e8", TextToSpeech.QUEUE_FLUSH, null, null);
    }
else {
    tts.speak("12 e8", TextToSpeech.QUEUE_FLUSH, null);
    }

我只需要在模拟器上测试一下。

顺便说一句,@Aditya,由于你非常乐于助人,我一直卡在同一个项目中,它应该使用TextToSpeech说出话并打开屏幕,但我没有成功打开屏幕。我尝试使用了所有我找到的示例中的wakelocks和标志 :) 这是通过我设法使之工作的接近传感器完成的。它会说出文字,但不显示屏幕。你能帮我吗?

练习是成功的关键。我提供的所有建议答案都在我的eclipse IDE中完美运行。解决屏幕锁定的方法如下:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
 wl.acquire();
   ..screen will stay on during this section..
 wl.release();

6
与您当前的条件不同,您应该使用if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ... } else { ... } - EpicPandaForce

2

(1) 我的活动实现了TextToSpeech.OnInitListener接口。

(2) 在onInit方法中播放合成语音,但我认为(尚未尝试)您可以在调用onInit()之后的任何时间播放它。但这是关键,您必须等待TextToSpeech引擎初始化完成。

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
    public TextToSpeech mTTS;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTTS = new TextToSpeech(this, this);
    }

    @Override
    public void onInit(int i) {
        mTTS.setLanguage(Locale.UK);
        mTTS.speak("Hello, how are you?", TextToSpeech.QUEUE_ADD, null, null);
    }    
}

0

关于wakelock,我成功地通过以下方式使其工作:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP |
                                    PowerManager.ON_AFTER_RELEASE, "MyWakelock");

wl.aquire();
wl.release();

0

试试这个

tts=new TextToSpeech(getBaseContext(),new TextToSpeech.OnInitListener() 
{       
       @Override        
       public void onInit(int status) 
       {
            tts.setLanguage(Locale.getDefault());
            tts.setPitch(1.3f);
            tts.setSpeechRate(1f);
       }
});

对我来说有点困惑。我尝试了几种方法,但都出现错误。对于出错的那一行代码,它是这样的:"speak(CharSequence text, int queueMode, Bundle params, String utteranceId)"。这是Android Studio建议的。作为新手,我不知道如何填写这些字段。 - Jose Borges
在此之前,请先初始化文本转语音。 - Aditya
tts.speak(tv3.getText().toString(), TextToSpeech.QUEUE_FLUSH, null); tv是文本视图,您也可以使用一行代码。 - Aditya
tts.speak("你好,我是TTS", TextToSpeech.QUEUE_FLUSH, null); - Aditya
那个方法已经在API 21中弃用了,这就是我的问题,它的语法是speak(String text, int queueMode, HashMap params)。Android Studio建议使用的是:speak(CharSequence text, int queueMode, Bundle params, String utteranceId)。 - Jose Borges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接