gpt4 book ai didi

java - 如何加快文本转语音的初始化速度

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:54 31 4
gpt4 key购买 nike

我正在开发一个应用程序,它需要使用文本转语音类才能读取文本。问题是初始化非常慢,大约需要 4 秒。我遵循了本教程:http://code.tutsplus.com/tutorials/use-text-to-speech-on-android-to-read-out-incoming-messages--cms-22524 。我做了一些研究,但没有找到真正好的答案,或者我想念它们。

例如我尝试了这个 solution通过在线程中调用我的 checkTTS 函数,但没有可见结果。 Herehere ,他们说我的 checkTTS 功能可能没有那么有用,我只能看看我需要的语言是否可用。

所以我的问题:

  • 我真的可以只检查我的语言是否存在吗?ACTION_CHECK_TTS_DATA 和只检查语言是否可用之间的最大区别是什么?
  • 我可以改进其他方面吗?

这是我的 Activity 代码:

public class MyActivity extends Activity {
private Speaker _speaker;
private final int CHECK_CODE = 0x1;
private final int SHORT_DURATION = 1000;

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

System.out.println("I'm just before checkTTS");
checkTTS();
}


private void checkTTS(){
System.out.println("I'm in checkTTS");
Intent check = new Intent();
check.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(check, CHECK_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == CHECK_CODE){
if(resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){
System.out.println("I'm in onActivityResult");
_speaker = new Speaker(this);
}else {
Intent install = new Intent();
install.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(install);
}
}
}

@Override
protected void onDestroy() {
super.onDestroy();
_speaker.destroy();
}
}

这是我的演讲者类(class):

public class Speaker implements OnInitListener {
private TextToSpeech _tts;
private boolean _ready = false;
private boolean _allowed = false;

public Speaker(Context context){
_tts = new TextToSpeech(context, this);
}

public void setSpeedRate(float speechrate) {
_tts.setSpeechRate(speechrate);
}

public boolean isAllowed(){
return _allowed;
}

public void allow(boolean allowed){
_allowed = allowed;
}

@Override
public void onInit(int status) {
System.out.println("I'm in onInit from Speaker");
if(status == TextToSpeech.SUCCESS){
_tts.setLanguage(Locale.UK);
_ready = true;
} else{
_ready = false;
}
}

public void speak(String text){
if(_ready && _allowed) {
HashMap<String, String> hash = new HashMap<String,String>();
hash.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION));
_tts.speak(text, TextToSpeech.QUEUE_ADD, hash);
}
}

public boolean isSpeaking() {
return _tts.isSpeaking();
}

public void pause(int duration){
_tts.playSilence(duration, TextToSpeech.QUEUE_ADD, null);
}

public void stop() {
_tts.stop();
}

public void destroy(){
_tts.shutdown();
}
}

这是来自 eclipse 的日志:

15:14:58.897: D/dalvikvm(23966): GC_CONCURRENT freed ...
15:15:00.014: I/System.out(23966): I'm just before checkTTS
15:15:00.014: I/System.out(23966): I'm in checkTTS
15:15:00.046: D/AbsListView(23966): unregisterIRListener() is called
15-13 15:15:01.272: I/System.out(23966): I'm in onActivityResult
15:15:01.311: I/TextToSpeech(23966): Sucessfully bound to com.samsung.SMT
15:15:01.663: D/AbsListView(23966): onVisibilityChanged() is called, visibility : 4
15:15:01.663: D/AbsListView(23966): unregisterIRListener() is called
15:15:02.600: I/TextToSpeech(23966): Connected to ComponentInfo{com.samsung.SMT/...}
15:15:02.608: I/TextToSpeech(23966): onServiceConnected but waiting
15:15:02.608: I/System.out(23966): I'm in onInit from Speaker
15:15:02.616: I/System.out(23966): Speaker ready
15:15:02.616: I/TextToSpeech(23966): onServiceConnected waiting end

感谢您的帮助,此致,泽德13

PS:抱歉,错误......

编辑:有趣的事实,三星语音的启动速度似乎比谷歌语音的启动速度更快......

最佳答案

  1. 根据Android API , ACTION_CHECK_TTS_DATA “从平台 TextToSpeech 引擎启动 Activity ,以验证系统上资源文件的正确安装和可用性”。在这种情况下,在收到 CHECK_VOICE_DATA_PASS 之前创建 TTS 实例是没有意义的。或者,如果由于某种原因(状态标志等)您确信系统已安装所需的 TTS 资源,您可以使用“乐观方法”,即跳过此步骤,初始化 TTS 实例(例如,在您的 onCreate 方法中),然后检查 available languagesif some language is supported 。由于您跳过了一个步骤 (ACTION_CHECK_TTS_DATA),因此如果一切成功,您的初始化将会更快。

您可以检查系统中安装的引擎looking to this code并使用该信息来启动更准确的 ACTION_CHECK_TTS_DATA Intent 。

  • 从性能的角度来看,其余代码看起来不错。但是,请记住,您可以启动 ACTION_CHECK_TTS_DATA Intent 并同时初始化 TTS 实例!如果缺少某些内容,则 Intent 已启动,并且 TTS 将无法按预期工作。如果设备拥有所有 TTS 资源,则 Intent 将通过并且 TTS 已初始化。您可以查看Audio News app作为这种行为的一个例子;)
  • 关于java - 如何加快文本转语音的初始化速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30218379/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com