2017-07-26 1 views
4

Je voudrais savoir comment correctement laisser mon iPhone parler une phrase pendant que mon application est en arrière-plan, mais ensuite revenir à tout ce qui jouait avant.Utilisez AVSpeechSynthesizer en arrière-plan sans arrêter f.e. application de musique

Ma question est tout à fait semblable à AVSpeechSynthesizer in background mode mais encore une fois avec la différence que je veux être en mesure de « dire quelque chose » tout en arrière-plan sans avoir à arrêter la musique en cours de lecture. Donc pendant que mon AVSpeechSynthesizer parle, la musique devrait faire une pause (ou être un peu moins bruyante) mais ensuite elle devrait reprendre. Même lorsque mon application est actuellement en arrière-plan. Ce que j'essaie d'archiver est un résumé parlé des statistiques de suivi tout en GPS-Tracking dans mon application de fitness. Et les chances sont que vous écoutez de la musique est assez élevé, et je ne veux pas déranger l'utilisateur ...

+0

Avez-vous déjà regardé à AVAudioSessionCategoryOptionMixWithOthers et options similaires? – kvr

Répondre

1

J'ai trouvé la réponse moi-même ...

la partie importante ist pour configurer le AVAudioSession avec l'option .duckOthers:

let audioSession = AVAudioSession.sharedInstance() 
try audioSession.setCategory(AVAudioSessionCategoryPlayback, with: .duckOthers) 

Cela fera la lecture de fe la musique moins forte mais cela la rendrait moins forte même quand la parole est faite. C'est pourquoi vous devez définir un délégué pour la AVSpeechSynthesizer puis le manipuler comme ceci:

func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) { 
    guard !synthesizer.isSpeaking else { return } 

    let audioSession = AVAudioSession.sharedInstance() 
    try? audioSession.setActive(false) 
} 

De cette façon, la musique continuera avec un volume normal après la parole est fait.

De plus, juste avant de parler, j'activer mon audioSession juste pour vous assurer (pas sûr si cela serait vraiment nécessaire, mais comme je le fais, je n'ai pas plus de problèmes ...)

2

Pour swift 3, AVKit import puis ajouter

try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
+0

Vous devez configurer la session audio dans votre AppDelegate –

+0

J'ai déjà trouvé la solution ... Je dois définir la catégorie mais aussi définir l'option '.duckOthers'. Ensuite, j'ai besoin d'un délégué pour 'AVSpeechSynthesizer' et de mettre la session inactive une fois qu'il a fini de parler ... – Georg

+0

AVKit doit être remplacé par AVFoundation et régler" Audio et AirPlay "dans les modes d'arrière-plan est évidemment encore nécessaire – cristallo