【问题标题】:TextToSpeech with API 21使用 API 21 的 TextToSpeech
【发布时间】:2015-01-15 16:26:05
【问题描述】:

有人可以帮助我使用带有 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(字符串文本,int queueMode,HashMap 参数) 此方法在 API 级别 21 中已弃用。从 API 级别 21 开始,由 speak(CharSequence, int, Bundle, String) 取代。

有人可以帮我编写应用程序的代码吗?

【问题讨论】:

    标签: android api text-to-speech


    【解决方案1】:

    我搜索了各种网站。最后,我想我可以得到你的问题的答案......

    而不是直接调用 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 确认了上述代码。

    【讨论】:

      【解决方案2】:
      tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null);
      

      试试这个。

      【讨论】:

      • 好吧,在构建应用程序之后,Android Studio 报告说,该语法仅适用于 API 21。所以也许它可以工作,但我的设备不是棒棒糖,我无法测试它。那么问题是如何创建一个与 api 20 和 api 21 兼容的 TextToSpeech 应用程序。
      • 对两者都使用不推荐使用的方法并尝试应用程序在模拟器中运行它显示的内容
      • 两种方法都会崩溃
      • 顺便说一句,我的电脑需要 1 小时 :) 打开模拟器。
      • 我想我找到了解决方案。就是放一个检测api级别的if条件,然后相应地触发不同的语法
      【解决方案3】:

      所以我想这就是诀窍:

      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 并打开屏幕,但我没有设法打开屏幕。我已经尝试使用我发现的所有示例中的唤醒锁和标志:) 这是通过我设法工作的接近传感器完成的。它说文本,但不显示屏幕。你能帮我解决这个问题吗?

      良好的实践是成功的关键。我建议的所有答案都可以在我的 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();
      

      【讨论】:

      • 您应该使用if(Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.LOLLIPOP) { ... } else { ... },而不是您当前的情况
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        试试这个

        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 建议的。我是新手,我不知道如何填写这些字段。
        • 按照我的回答在顶部初始化文本到语音
        • tts.speak(tv3.getText().toString(),TextToSpeech.QUEUE_FLUSH,null); tv 是文本视图,或者您可以使用一行作为
        • tts.speak("Hello its TTS",TextToSpeech.QUEUE_FLUSH,null);
        • 该方法已被 API 21 弃用,这是我的问题,这是语法 speak(String text, int queueMode, HashMap params),Android Studio 建议的一个是:speak(CharSequence text, int queueMode , 捆绑参数, 字符串 utteranceId)。
        【解决方案6】:

        wakelock,我设法让 ti 以这种方式工作:

        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();
        

        【讨论】:

          猜你喜欢
          • 2015-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-05
          • 2018-09-24
          • 1970-01-01
          相关资源
          最近更新 更多