【问题标题】:Android Text to Speech (TTS) only playing last value in foor loopAndroid Text to Speech (TTS) 仅在 for 循环中播放最后一个值
【发布时间】:2018-06-14 11:04:19
【问题描述】:

我有一些代码可以从网站中提取一些 JSON,我希望它循环遍历字符串值,并将它们转换为语音。

问题是,所有字符串都正确打印,但文本到语音只播放最后一个值。我怎样才能让它在遍历数组时播放每个单独的值。

这是我对代码所做的。

    public class MainActivity extends AppCompatActivity  {

    TextToSpeech t1;
    final String BASE_URL = "x";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        t1=new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {

            @Override
            public void onInit(int status) {
                if(status != TextToSpeech.ERROR) {
                    t1.setLanguage(Locale.UK);
                }
            }


        });



        final JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, BASE_URL, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

                try {

                    JSONObject data = response.getJSONObject("x");
                    JSONArray children = data.getJSONArray("x");

                    for (int i = 0; i<children.length(); i++) {

                        JSONObject json_data = children.getJSONObject(i).getJSONObject("x");
                        Log.v("test", "Err:" + json_data.getString("title"));

                        String a = json_data.getString("title");

                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {


                            t1.speak(a,TextToSpeech.QUEUE_FLUSH,null,null);
                        } else {
                            t1.speak(a, TextToSpeech.QUEUE_FLUSH, null);
                        }



                    }


                } catch (JSONException e) {

                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.v("Test", "Err:" + error.getLocalizedMessage());
            }
        });

        Volley.newRequestQueue(this).add(jsonRequest);
    }


}

谢谢

【问题讨论】:

    标签: android text-to-speech


    【解决方案1】:

    QUEUE_FLUSH 将导致之前的任何讲话被新讲话打断。你可以把它改成QUEUE_ADD,然后一切都会说出来。

    这些解释in the TTS documentation

    【讨论】:

      【解决方案2】:

      您可以像这样简单地连接字符串并在 for 循环的末尾播放文本

      String my_text = "";
      for (int i = 0; i<children.length(); i++) 
      {
          JSONObject json_data = children.getJSONObject(i).getJSONObject("x");
          Log.v("test", "Err:" + json_data.getString("title"));
      
          String a = json_data.getString("title");
          my_text ="    "+a;
       }
      
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
       {
           t1.speak(my_text ,TextToSpeech.QUEUE_FLUSH,null,null);
       } else {
           t1.speak(my_text , TextToSpeech.QUEUE_FLUSH, null);
       }
      

      【讨论】:

        【解决方案3】:

        我也面临同样的问题。希望我的回答对某人有所帮助。

        我在 kotlin 中使用了间隔间隙很少的数据数组列表。您可以根据数据数组更改分隔符字符串。

        private fun convertTextToSpeech() {
        val speech = arrayList.joinToString(separator = "?")
        val myHash = HashMap<String, String>()
        val bundle = Bundle()
        bundle.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"done")
        myHash[TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID] = "done"
        
        val splitSpeech = speech.split("\\?".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
        
        for (i in splitSpeech.indices) {
            Log.i("responseString",splitSpeech[i])
            if (i == 0) { // Use for the first splited text to flush on audio stream
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    tts?.speak( splitSpeech[i].trim { it <= ' ' },TextToSpeech.QUEUE_FLUSH, bundle, null);
                } else {
                    tts?.speak( splitSpeech[i].trim { it <= ' ' }, TextToSpeech.QUEUE_FLUSH, myHash);
                }
        
            } else { // add the new test on previous then play the TTS
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    tts?.speak( splitSpeech[i].trim { it <= ' ' }, TextToSpeech.QUEUE_ADD, bundle, null);
                } else {
                    tts?.speak( splitSpeech[i].trim { it <= ' ' }, TextToSpeech.QUEUE_ADD, myHash);
                }
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                tts?.playSilentUtterance(750, TextToSpeech.QUEUE_ADD, null)
            } else {
                tts?.playSilence(750, TextToSpeech.QUEUE_ADD, null)
            }
        }
        

        }

        【讨论】:

          猜你喜欢
          • 2021-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-11
          • 2022-01-25
          • 1970-01-01
          • 2017-07-28
          • 1970-01-01
          相关资源
          最近更新 更多