2

我试图让 TTS 在后台运行。但是,我从来没有听到任何声音。我有一个启动服务的广播接收器。我把我的 TTS 代码放在这两个里面,但它从不说话。我知道正在调用该方法(我在其上放置了一个断点),但它仍然不起作用。

这是我的日志,但它似乎没有包含有关 TTS 服务的任何内容。

10-04 22:45:30.663: WARN/InputManagerService(209): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4423df40
10-04 22:45:37.363: INFO/PollingManager(449): calculateShortestInterval(): shortest interval is 540000
10-04 22:45:37.413: INFO/TLSStateManager(449): org.apache.harmony.nio.internal.SocketChannelImpl@4400ece0: Wrote out 29 bytes of data with 0 bytes remaining.
10-04 22:45:38.043: ERROR/IMAPEmailService(480): Can't create default IMAP system folder Trash. Please reconfigure the folder names.
10-04 22:45:40.123: ERROR/EONS(303): EF_PNN: No short Name
10-04 22:45:41.543: ERROR/WMSTS(171): Month is invalid: 0
10-04 22:45:42.043: WARN/AudioFlinger(172): write blocked for 212 msecs, 24 delayed writes, thread 0xb998

提前谢谢大家!

4

6 回答 6

13

查看您的 TTS 代码有助于人们更轻松地为您提供帮助。由于我已经在 BroadcastReceiver 中使用了 TTS,因此这是一个从我的代码中删减的示例。

public static class TTS extends Service implements TextToSpeech.OnInitListener, OnUtteranceCompletedListener {
    private TextToSpeech mTts;
    private String spokenText;

    @Override
    public void onCreate() {
        mTts = new TextToSpeech(this, this);
        // This is a good place to set spokenText
    }

    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            int result = mTts.setLanguage(Locale.US);
            if (result != TextToSpeech.LANG_MISSING_DATA && result != TextToSpeech.LANG_NOT_SUPPORTED) {
                mTts.speak(spokenText, TextToSpeech.QUEUE_FLUSH, null);
            }
        }
    }

    @Override
    public void onUtteranceCompleted(String uttId) {
        stopSelf();
    }

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

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}

在 BroadcastReceiver 中您希望它说话的位置启动 TTS 服务:

context.startService(new Intent(context, TTS.class));

如果不是提问者,我希望这对某人有所帮助(我相信他现在已经开始工作了)。

于 2011-04-13T09:02:50.657 回答
2

你也可以试试这个,如果要说的文字来自广播听众。首先创建一个服务

public class MyTell extends Service implements OnInitListener{
   public MyTell() {
   }

   public static TextToSpeech mTts;

   @Override
   public IBinder onBind(Intent intent) {
       return null;
   }

   public void onStart(Intent intent, int startId) {
       // TODO Auto-generated method stub
       mPreferences = getSharedPreferences(Mysettings.PREF_NAME, Service.MODE_PRIVATE);

       pit = Float.parseFloat(mPreferences.getString("pit","0.8"));
       rate = Float.parseFloat(mPreferences.getString("rate","1.1"));
       mTts = new TextToSpeech(this, this);
       super.onStart(intent, startId);
   }

public void onInit(int status) {
    // TODO Auto-generated method stub
    if (status == TextToSpeech.SUCCESS) {
        if (mTts.isLanguageAvailable(Locale.UK) >= 0)

        Toast.makeText( MyTell.this,
                "Sucessfull intialization of Text-To-Speech engine Mytell ",
                Toast.LENGTH_LONG).show();
        mTts.setLanguage(Locale.UK);

        mTts.setPitch(pit);
        mTts.setSpeechRate(rate);

    } else if (status == TextToSpeech.ERROR) {
        Toast.makeText(MyTell.this,
                "Unable to initialize Text-To-Speech engine",
                Toast.LENGTH_LONG).show();
    }
}}

然后在您插入文本的位置创建侦听器

public class MyBroadCast extends BroadcastReceiver {
    public MyPop() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        //here is where you're use the service you created to speak the text
        MyTell.mTts.speak("Text to be spoken", TextToSpeech.QUEUE_FLUSH,null);

    }
}

确保在使用 tts 引擎之前启动服务,并检查 tts 引擎是否可用

于 2013-03-21T19:26:17.897 回答
1

它对我有用(只需添加 mainfest 权限)

public class TES extends Service implements TextToSpeech.OnInitListener {

  private TextToSpeech tts;

  @Override
  public IBinder onBind(Intent arg0) {
    return null;
  }

  @Override
  public void onCreate() {
    super.onCreate();
  }

  @Override
  public void onDestroy() {
    // TODO Auto-generated method stub
    if (tts != null) {
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
  }

  @Override
  public void onStart(Intent intent, int startId) {
    tts = new TextToSpeech(this, this);
    speakOut();
  }

  @Override
  public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
      int result = tts.setLanguage(Locale.US);
      if (result == TextToSpeech.LANG_MISSING_DATA
        || result == TextToSpeech.LANG_NOT_SUPPORTED) {
          Log.e("TTS", "This Language is not supported");
      }
      speakOut();
    } else {
      Log.e("TTS", "Initilization Failed!");
    }
  }

  private void speakOut() {
    tts.speak("its working", TextToSpeech.QUEUE_FLUSH, null);
  }
}
于 2013-08-13T17:43:41.120 回答
0

Android TTS 是一项有界服务。广播接收器的上下文有限,不能将自己绑定到任何服务。但是,它可以启动服务。此处显示的所有示例都是启动 TTS 引擎的服务和启动它们的接收器。您也可以通过活动来完成,但如果您不需要 UI,则服务会更好。我只是认为了解它是如何工作的以及为什么工作是一个好主意。祝你好运。

于 2015-12-29T20:51:59.680 回答
0

使用 Kotlin,上述答案可以重写为:

Receiver

class MyReceiver : BroadcastReceiver() {
    val ttsService = Intent(context, TTS::class.java)
    context.startService(ttsService)
}

Service

class TTS : Service(), TextToSpeech.OnInitListener {
    private var mTts: TextToSpeech? = null
    private var spokenText: String? = null

    override fun onCreate() {
        mTts = TextToSpeech(this, this)
        // This is a good place to set spokenText
        spokenText = "Hello!.."
    }

    override fun onInit(status: Int) {
        if (status == TextToSpeech.SUCCESS) {
           val result = mTts!!.setLanguage(Locale.US)
            if (result != TextToSpeech.LANG_MISSING_DATA && result != TextToSpeech.LANG_NOT_SUPPORTED) {
                Thread().run {
                    mTts!!.apply {
                        speak(spokenText, TextToSpeech.QUEUE_FLUSH, null, null)
                    }
                    Thread.sleep(10000)
                    stopSelf()
                }
            }
        } else if (status == TextToSpeech.ERROR) {
           stopSelf()
        }
    }

    override fun onDestroy() {
       if (mTts != null) {
            mTts!!.stop()
            mTts!!.shutdown()
        }
        super.onDestroy()
    }

    override fun onBind(arg0: Intent): IBinder? {
        return null
    }
}

并且在Manifest

<receiver
    android:name=".MyReceiver">
    <intent-filter>
        <action android:name="android.intent.action.xxxx" />
    </intent-filter>
</receiver>

<service android:name=".TTS" />
于 2018-04-27T21:36:29.063 回答
0

Android-O 以后使用此类服务​​的服务有后台限制可以使用 JobIntentService 来实现与此处所示相同的功能。

于 2019-03-30T08:13:52.677 回答