最近在開發 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 終於可以在背景播放了,我可以回去繼續開發了。