在第一次调用时,KitKat比Froyo多花6秒钟对TextToSpeech.speak()作出反应

时间:2014-11-09 03:26:49

标签: android performance initialization delay text-to-speech

在最近运行Android版本的手机上,与旧款手机相比,TextToSpeech引擎在首次调用时可能需要大约6秒钟才能做出反应。

我的测试代码如下所示。 (已编辑:Android 4.0.3冰淇淋三明治的替代代码,API 15及更高版本,最后显示。)

在运行4.4.4 KitKat的1年前摩托罗拉Moto G上,TextToSpeech引擎可能需要7秒多才能完成对speak()单词“已启动”的第一次调用。这是我的代码的输出。

D/speak﹕ call: 1415501851978
D/speak﹕ done: 1415501859122, delay: 7144

在3岁的三星SGH-T499Y上运行2.2 Froyo,完成发言只需不到一秒钟:

D/speak﹕ call: 1415502283050
D/speak﹕ done: 1415502283900, delay: 850

有没有办法发现在这6秒延迟期间发生的事情? 是否有某种方法可以让更新(并且可能更快)的设备更快地做出反应?

package com.example.speak

import android.app.Activity;
import android.speech.tts.TextToSpeech;
import android.os.Bundle;
import android.util.Log;

import java.util.HashMap;
import java.util.Locale;


public class MainActivity extends Activity implements TextToSpeech.OnInitListener,
        TextToSpeech.OnUtteranceCompletedListener {

    private final String TAG = "speak";
    private Activity activity;
    private TextToSpeech tts;
    private long launchTime;

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

        tts = new TextToSpeech(getApplicationContext(), this);
    }

    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            tts.setOnUtteranceCompletedListener(this);
            tts.setLanguage(Locale.UK);
            ttsSay("Started");
        }
    }

    private void ttsSay(String toSpeak) {
        int mode = TextToSpeech.QUEUE_FLUSH;
        HashMap hashMap = new HashMap<String, String>();
        hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, TAG);

        launchTime = System.currentTimeMillis();
        Log.d(TAG, "call: " + launchTime);
        tts.speak(toSpeak, mode, hashMap);
    }

    public void onUtteranceCompleted(String utteranceID) {
        long millis = System.currentTimeMillis();
        Log.d(TAG, "done: " + millis + ", delay: " + (millis - launchTime));
    }
}

编辑:从Ice Cream Sandwich 4.0.3开始,API 15,Android提供UtteranceProgressListener,可用于计算文本到语音播放的开始和结束时间。以下与Froyo不兼容;

package com.example.announceappprogress;

import android.app.Activity;
import android.speech.tts.TextToSpeech;
import android.os.Bundle;
import android.speech.tts.UtteranceProgressListener;
import android.util.Log;

import java.util.HashMap;
import java.util.Locale;


public class MainActivity extends Activity implements TextToSpeech.OnInitListener {

    private final String TAG = "speak";
    private TextToSpeech tts;
    private long launchTime;
    private long startTime;


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

        tts = new TextToSpeech(getApplicationContext(), this);
        tts.setOnUtteranceProgressListener(mProgressListener);
    }

    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(Locale.UK);
            ttsSay("Started");
        }
    }

    private void ttsSay(String toSpeak) {
        int mode = TextToSpeech.QUEUE_FLUSH;
        HashMap hashMap = new HashMap<String, String>();
        hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, TAG);

        launchTime = System.currentTimeMillis();
        Log.d(TAG, "called: " + launchTime);
        tts.speak(toSpeak, mode, hashMap);
    }

    private final UtteranceProgressListener mProgressListener = new UtteranceProgressListener() {
        @Override
        public void onStart(String utteranceId) {
            startTime = System.currentTimeMillis();
            Log.d(TAG, "started: " + startTime + ", delay: " + (startTime - launchTime));
        }

        @Override
        public void onError(String utteranceId) {} // Do nothing.


        @Override
        public void onDone(String utteranceId) {
            long millis = System.currentTimeMillis();
            Log.d(TAG, "done: " + millis + ", total: " + (millis - launchTime) + ", duration: " + (millis - startTime));
        }
    };
}

以下是运行4.4.4 KitKat的Motorola Moto G的输出示例:

D/speak﹕ called:  1415654293442
D/speak﹕ started: 1415654299287, delay: 5845
D/speak﹕ done:    1415654299995, total: 6553, duration: 708

1 个答案:

答案 0 :(得分:1)

您可能没有在两台设备上使用相同的TTS引擎。

更人性化的串联TTS引擎(您可能已在新设备上安装)可以使用数百兆字节的数据文件来生成语音。大多数这些系统需要一定量的设置时间用于第一次发声。基于共振峰的简单(和更多机械发声)系统可能只需要几兆字节,因此加载速度要快得多。

一个有趣的实验是计算第二个&#34;发声。我预测这比你的新手机上的第一个更快。此外,更自然的发声TTS系统通常在呼叫TTS和来自话语的声音开始之间具有更长的等待时间。特别是如果给出一个长句,因为系统会查看整个句子,以便在开始说话之前制定最佳措辞。

此外,您确定您的新设备没有使用某些基于云的TTS服务吗?还有其他重要的附加变量会影响延迟。