1

私は自分のアプリのクラスの 1 つで、この種のテキスト読み上げを使用しています (コードは、見通しと正確な要件を示すために編集されています)。ビューにいくつかのコンテンツを表示し、ボタンをクリックすると、この texttospeech エンジンを使用してサウンドを再生したいのですが、初めてサウンドを再生していません。次のクリック以降、TEXTTOSPEECH エンジンはうまく機能しています。

この問題を克服する方法を知りたい....

public class LearnActivity extends Activity implements OnClickListener, OnInitListener {

AudioManager audioManager;
float volume;

TextToSpeech textToSpeech;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_learn);

   textToSpeech = new TextToSpeech(this, this);
    textToSpeech.setLanguage(Locale.US);
    textToSpeech.setSpeechRate(0.95f);

       method();
}
   public void method(){
      bt.setonClickListener(new onClickListener(){
        public void onClick(View v){
                        playSound(datasource.getItemSound);                  
              }

        });

      }
   public void playSound(String sound){
         textToSpeech.speak(sound,TextToSpeech.QUEUE_FLUSH,null);
         }   

@Override
public void onInit(int status) {
    // TODO Auto-generated method stub

}

注:- これは私の要件、onClicks などを使用せずに TEXTTOSPEECH エンジンから直接サウンドを再生する方法も満たしています... Android の Text-To-Speech エンジンのみで起動サウンドも再生したいため...

4

4 に答える 4

3

これは、エンジンの準備が整う前にボタンをクリックしているためです。

メソッドで TTS エンジンが正常に初期化されたかどうかを確認し、onInit()それに応じて再生ボタンを有効/無効にする必要があります。

あなたのコードには、メソッドを持つbtある種のものがあると仮定します:ViewsetEnabled(boolean)

@Override
public void onInit(int status) {
    bt.setEnabled(status == TextToSpeech.SUCCESS);
}

エンジンが初期化されていないことを常に想定する必要があるため、デフォルトで再生ボタンを無効にしておく必要があります。

于 2013-06-04T14:07:45.507 に答える
-2

5秒間遅延させるだけで、ボタンをクリックしなくても機能します

public class Final_Text_To_Speech_Activity extends AppCompatActivity implements TextToSpeech.OnInitListener {

private TextToSpeech tts; // For Text to Speech
CardView ScanProduct, SearchProduct;


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

    tts = new TextToSpeech(this, this);
    init();

    // Just Put Delay For 5 Second And It's Working without any button Click
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {

            SpeakOutOnce("Welcome to Text To Speech Application");
        }
    }, 5000);


}


@Override
protected void onResume() {
    super.onResume();


}


public void init() {

    ScanProduct = (CardView) findViewById(R.id.scan_product);
    SearchProduct = (CardView) findViewById(R.id.search_product);


    // Search On Button Click
    ScanProduct.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            speakOut("You have Just pressed Scan  Option");
        }
    });


    SearchProduct.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            speakOut("You have Just pressed Search Option ");
        }
    });


}


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


@Override
public void onInit(int status) {

    int result = tts.setLanguage(Locale.US);
    if (status == TextToSpeech.SUCCESS) {

        if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
        } else {
            speakOut("");
        }
    } else if (status == TextToSpeech.ERROR) {
        Toast.makeText(this, "Sorry! Text To Speech failed...",
                Toast.LENGTH_LONG).show();
    }
}


private void speakOut(String text) {

    tts.setPitch(1.0f); //Normal Pitch
    tts.setSpeechRate(0.7f); // 1.0 is Normal speech Rate
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);

}


private void SpeakOutOnce(String text) {

    if (tts != null) {
        tts.setPitch(1.0f); //Normal Pitch
        tts.setSpeechRate(0.7f); // 1.0 is Normal speech Rate
        tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    }
}

}

于 2017-10-31T07:42:59.467 に答える