解決 Flutter 使用 TTS 在 iOS 嘗試背景播放時無法播放的問題

最近在開發 Flutter 的 App 時,需要使用 TTS 在背景進行 TTS 語音播放。

我選擇使用 flutter_tts 這個 Package,這個 Package 可以讓我們在 Flutter 中使用 TTS 進行語音播放。

不過,我按照官方的範例設定後,在 iOS 的時候,TTS 卻無法在背景播放。

網路上并沒有太多相關的資料,我也是查了很多資料,終於找到解決方法,這邊就分享一下我怎麼解決的。

官方範例

以下這段是官方的範例,設定 TTS 在 iOS 的背景播放和與其他 App 混合播放。

await flutterTts.setIosAudioCategory(IosTextToSpeechAudioCategory.ambient,
     [
          IosTextToSpeechAudioCategoryOptions.allowBluetooth,
          IosTextToSpeechAudioCategoryOptions.allowBluetoothA2DP,
          IosTextToSpeechAudioCategoryOptions.mixWithOthers
     ],
     IosTextToSpeechAudioMode.voicePrompt
);

我嘗試按照官方的範例設定,無論我怎麼設定,都總是怪怪的。

我的解決方法

在網路上查了很多資料,終於找到解決方法。

我們需要先把 IosTextToSpeechAudioCategory.ambient 改成 IosTextToSpeechAudioCategory.playback,這樣才可以在靜音模式下也能播放TTS。

之後,重頭戲來了,其實設定是按官方那樣設定沒錯了,只不過, flutter_tts 可能沒有直接設定到 iOS 的 AVAudioSession,才導致沒有效果

因此,我們直接在 Native 的 AppDelegate 那邊設定 AVAudioSession ,這樣就可以在背景播放 TTS 了。

第一步,我們需要在 AppDelegate.swift 頂部加入以下程式碼,把 AVFAudio 給 import 進來。

import AVFAudio

第二步,我們需要在 AppDelegate.swift 加入設定 AVAudioSession 的程式碼

先找到

GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)

然後,在上面加入以下這段程式碼:

// Set the audio session category to playback
let audioSession = AVAudioSession.sharedInstance()
do {
    try audioSession.setCategory(AVAudioSession.Category.playback,mode: AVAudioSession.Mode.voicePrompt, options:[AVAudioSession.CategoryOptions.mixWithOthers,AVAudioSession.CategoryOptions.duckOthers] )
} catch {
    print("Setting category to AVAudioSessionCategoryPlayback failed.")
}

這樣就搞定了,TTS 終於可以在背景播放了,我可以回去繼續開發了。

Built with Hugo
主題 StackJimmy 設計