android - tts - text to speech on line




Come mettere in pausa android.speech.tts.TextToSpeech? (7)

È possibile impostare la pausa TTS tra le frasi o ovunque si desideri aggiungendo fino a tre punti ("."), Seguito da un unico spazio "". L'esempio seguente ha una lunga pausa all'inizio e di nuovo prima del corpo del messaggio. Non sono sicuro che sia quello che stai cercando.

    private final BroadcastReceiver SMScatcher = new BroadcastReceiver() {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        if (intent.getAction().equals(
                "android.provider.Telephony.SMS_RECEIVED")) {
            // if(message starts with SMStretcher recognize BYTE)
            StringBuilder sb = new StringBuilder();

            /*
             * The SMS-Messages are 'hiding' within the extras of the
             * Intent.
             */
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                /* Get all messages contained in the Intent */
                Object[] pdusObj = (Object[]) bundle.get("pdus");
                SmsMessage[] messages = new SmsMessage[pdusObj.length];
                for (int i = 0; i < pdusObj.length; i++) {
                    messages[i] = SmsMessage
                            .createFromPdu((byte[]) pdusObj[i]);
                }
                /* Feed the StringBuilder with all Messages found. */
                for (SmsMessage currentMessage : messages) {
                    // periods are to pause
                    sb.append("... Message From: ");
                    /* Sender-Number */
                    sb.append(currentMessage.getDisplayOriginatingAddress());
                    sb.append(".. ");
                    /* Actual Message-Content */
                    sb.append(currentMessage.getDisplayMessageBody());
                }
                // Toast.makeText(application, sb.toString(),
                // Toast.LENGTH_LONG).show();
                if (mTtsReady) {
                    try {
                        mTts.speak(sb.toString(), TextToSpeech.QUEUE_ADD,
                                null);
                    } catch (Exception e) {
                        Toast.makeText(application, "TTS Not ready",
                                Toast.LENGTH_LONG).show();
                        e.printStackTrace();
                    }
                }
            }

        }
    }
};

Se si omette lo spazio dopo l'ultimo periodo, esso (o potrebbe) non funzionerà come previsto.

Sto giocando a testo con Android TTS - android.speech.tts.TextToSpeech

Io uso: TextToSpeech.speak per parlare e .stop per fermarsi. C'è un modo per mettere in pausa il testo anche?


Ho usato la suddivisione della stringa e usato playilence () come di seguito:

public void speakSpeech(String speech) {

    HashMap<String, String> myHash = new HashMap<String, String>();

    myHash.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "done");

    String[] splitspeech = speech.split("\\.");

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

        if (i == 0) { // Use for the first splited text to flush on audio stream

            textToSpeech.speak(splitspeech[i].toString().trim(),TextToSpeech.QUEUE_FLUSH, myHash);

        } else { // add the new test on previous then play the TTS

            textToSpeech.speak(splitspeech[i].toString().trim(), TextToSpeech.QUEUE_ADD,myHash);
        }

        textToSpeech.playSilence(750, TextToSpeech.QUEUE_ADD, null);
    }
}

In assenza di un'opzione di pausa, è possibile aggiungere silenzio per la durata di quando si desidera ritardare la conversazione del motore TTS. Questo, naturalmente, dovrebbe essere una "pausa" predeterminata e non contribuirebbe ad includere la funzionalità di un pulsante di pausa, ad esempio.

Per API <21: public int playSilence (long durationInMs, int queueMode, parametri di HashMap)

Per> 21: public int playSilentUtterance (long durationInMs, int queueMode, String utteranceId)

Ricordarsi di utilizzare TextToSpeech.QUEUE_ADD anziché TextToSpeech.QUEUE_FLUSH altrimenti cancellerà il discorso avviato in precedenza.


Inoltre, una citazione di escape (\ ") sembra averla messa in pausa un po '- almeno, se la metti intorno a una parola aggiunge spazio alla parola.


Non ho ancora provato questo, ma ho bisogno di fare la stessa cosa. Il mio pensiero è di dividere prima il testo del discorso in una serie di parole.

Quindi crea una funzione ricorsiva che riproduce la parola successiva al termine della parola corrente, mantenendo un contatore della parola corrente.


Questa soluzione non è perfetta, ma un'alternativa alla soluzione di @Aaron C potrebbe essere quella di creare una classe di sintesi vocale personalizzata come quella seguente. Questa soluzione potrebbe funzionare abbastanza bene se il tuo testo è relativamente breve e le parole pronunciate al minuto sono sufficientemente accurate per la lingua che stai utilizzando.

private class CustomTextToSpeech extends TextToSpeech {
    private static final double WORDS_PER_MS = (double)190/60/1000;

    long startTimestamp = 0;
    long pauseTimestamp = 0;

    private Handler handler;
    private Runnable speakRunnable;

    StringBuilder textToSpeechBuilder;

    private boolean isPaused = false;

    public CustomTextToSpeech(Context context, OnInitListener initListener){
        super(context, initListener);

        setOnUtteranceProgressListener(new UtteranceProgressListener() {
            @Override
            public void onDone(String arg0) {
                Log.d(TAG, "tts done. " + arg0);
                startTimestamp = 0;
                pauseTimestamp = 0;
                handler.postDelayed(speakRunnable, TTS_INTERVAL_MS);
            }

            @Override
            public void onError(String arg0) {
                Log.e(TAG, "tts error. " + arg0);
            }

            @Override
            public void onStart(String arg0) {
                Log.d(TAG, "tts start. " + arg0);
                setStartTimestamp(System.currentTimeMillis());
            }
        });

        handler = new Handler();

        speakRunnable = new Runnable() {
            @Override
            public void run() {
                speak();
            }
        };

        textToSpeechBuilder = new StringBuilder(getResources().getString(R.string.talkback_tips));
    }

    public void setStartTimestamp(long timestamp) {
        startTimestamp = timestamp;
    }
    public void setPauseTimestamp(long timestamp) {
        pauseTimestamp = timestamp;
    }

    public boolean isPaused(){
        return (startTimestamp > 0 && pauseTimestamp > 0);
    }

    public void resume(){
        if(handler != null && isPaused){
            if(startTimestamp > 0 && pauseTimestamp > 0){
                handler.postDelayed(speakRunnable, TTS_SETUP_TIME_MS);
            } else {
                handler.postDelayed(speakRunnable, TTS_INTERVAL_MS);
            }
        }

        isPaused = false;
    }

    public void pause(){
        isPaused = true;

        if (handler != null) {
            handler.removeCallbacks(speakRunnable);
            handler.removeMessages(1);
        }

        if(isSpeaking()){
            setPauseTimestamp(System.currentTimeMillis());
        }

        stop();
    }

    public void utter(){
        if(handler != null){
            handler.postDelayed(speakRunnable, TTS_INTERVAL_MS);
        }
    }

    public void speak(){
        Log.d(TAG, "textToSpeechBuilder: " + textToSpeechBuilder.toString());
        if(isPaused()){
            String[] words = textToSpeechBuilder.toString().split(" ");
            int wordsAlreadySpoken = (int)Math.round((pauseTimestamp - startTimestamp)*WORDS_PER_MS);
            words = Arrays.copyOfRange(words, wordsAlreadySpoken-1, words.length);

            textToSpeechBuilder = new StringBuilder();
            for(String s : words){
                textToSpeechBuilder.append(s);
                textToSpeechBuilder.append(" ");
            }
        } else {
            textToSpeechBuilder = new StringBuilder(getResources().getString(R.string.talkback_tips));
        }

        if (tts != null && languageAvailable)
            speak(textToSpeechBuilder.toString(), TextToSpeech.QUEUE_FLUSH, new Bundle(), "utter");
    }
}

dividere i messages in parti e ascoltare l'ultima utterance utilizzando listener di onutteranceprogress

 tts.playSilence(1250, TextToSpeech.QUEUE_ADD, null);






text-to-speech