11

Android Text To Speech を使用して大量のテキストを読み上げようとしています。デフォルトの Google 音声エンジンを使用しています。以下は私のコードです。

 public class Talk extends Activity implements TextToSpeech.OnInitListener {

        private ImageView playBtn;

        private EditText textField;

        private TextToSpeech tts;
        private boolean isSpeaking = false;

        private String finalText;

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

            //Intialize the instance variables
            playBtn = (ImageView)findViewById(R.id.playBtn);

            textField = (EditText)findViewById(R.id.textField);


            //Resister the listeners
            playBtn.setOnClickListener(new PlayBtnAction());

            //Other things
            tts = new TextToSpeech(this,this);

            //Get the web page text if called from Share-Via
            if (Intent.ACTION_SEND.equals(getIntent().getAction())) 
            {

                   new GetWebText().execute("");

            }
        }


        //This class will execute the text from web pages
        private class GetWebText extends AsyncTask<String,Void,String>
        {

            @Override
            protected String doInBackground(String... params) {
                // TODO Auto-generated method stub
                String text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
                String websiteText = "";


                 try {
                    //Create a URL for the desired page
                    URL url = new URL(text);
                    // Read all the text returned by the server
                    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
                    String str;
                    StringBuffer strBuffer = new StringBuffer("");

                    while ((str = in.readLine()) != null) 
                    {
                        strBuffer.append(str+"\n"+"\n");
                    }


                    in.close();

                    String html = strBuffer.toString();

                    Document doc = Jsoup.parse(html); 
                    websiteText = doc.body().text(); // "An example link"
                    //Toast.makeText(this, websiteText, Toast.LENGTH_LONG).show();

                 }
                 catch(Exception e)
                 {
                     Log.e("web_error", "Error in getting web text",e);
                 }
                return websiteText;
            }

            @Override
            protected void onPostExecute(String result)
            {
                textField.setText(result);
            }

        }

        }

        //Class to speak the text
            private class PlayBtnAction implements OnClickListener
            {


                @Override
                public void onClick(View v) 
                {

                    // TODO Auto-generated method stub
                    if(!isSpeaking)
                    {
                        isSpeaking = true;
                        //speak(textField.getText().toString());
                        finalText = textField.getText().toString();
                        new SpeakTheText().execute(finalText);
                        isSpeaking = false;
                    }
                    else
                    {
                        isSpeaking = false;
                        tts.stop();
                    }



                }

            }



        @Override
        public void onInit(int status) {
            // TODO Auto-generated method stub
            if(status==TextToSpeech.SUCCESS)
            {
                int result = tts.setLanguage(Locale.UK);

                if(result==TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)
                {
                    Toast.makeText(this, "Language Not Supported", Toast.LENGTH_LONG).show();
                }
            }

        }


        //This class will speak the text
        private class SpeakTheText extends AsyncTask<String,Void,String>
        {

            @Override
            protected String doInBackground(String... params) {
                // TODO Auto-generated method stub
                tts.speak(params[0], TextToSpeech.QUEUE_FLUSH, null);
                return null;
            }

        }


          @Override
            public void onDestroy()
            {
                if(tts!=null)
                {
                    tts.stop();
                    tts.shutdown();

                }
                super.onDestroy();
            }

    }

しかし、ここでの問題は、大量のテキスト (Web ページからテキストを抽出したとしましょう) がある場合、TTS がそれを読み取れないことです。ほとんどのテキストを削除すると、それが読み取られます。なぜこうなった?

大きなテキストを読み込もうとすると、LogCat は次のように表示します。

10-11 07:26:05.566: D/dalvikvm(2638): GC_CONCURRENT freed 362K, 44% free 3597K/6312K, paused 17ms+8ms, total 93ms
4

5 に答える 5

14

文字列の長さは、docsからの事前定義された長さより長くしてはなりません:

パラメーター

text 読み上げられるテキストの文字列。getMaxSpeechInputLength ()文字以内。

戻り値 bygetMaxSpeechInputLength()はデバイスごとに異なる場合がありますが、AOSP ソースによると、なんと 4000です。

/**
 * Limit of length of input string passed to speak and synthesizeToFile.
 *
 * @see #speak
 * @see #synthesizeToFile
 */
public static int getMaxSpeechInputLength() {
    return 4000;
}

その制限を超えないようにしてください。入力テキストの長さをその値と比較し、必要に応じて別々の部分に分割してください。

于 2013-10-11T08:57:50.963 に答える
4

このコードを使用してください...任意のファイルで機能します..文字列を音声機能に送信するだけです..

private void speech(String charSequence) {

    int position ;


    int sizeOfChar= charSequence.length();
    String testStri= charSequence.substring(position,sizeOfChar);


    int next = 20;
    int pos =0;
    while(true) {
        String temp="";
        Log.e("in loop", "" + pos);

        try {

      temp = testStri.substring(pos, next);
            HashMap<String, String> params = new HashMap<String, String>();
            params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, temp);
            engine.speak(temp, TextToSpeech.QUEUE_ADD, params);

            pos = pos + 20;
            next = next + 20;

        } catch (Exception e) {
            temp = testStri.substring(pos, testStri.length());
            engine.speak(temp, TextToSpeech.QUEUE_ADD, null);
            break;

        }

    }

}
于 2016-09-26T06:27:20.893 に答える