2014-10-21 23 views
7

Tôi đang sử dụng AVSpeechSynthesizer trong một đĩa đơn. Trong iOS 8, khi ứng dụng được phát trong một thời gian, khi ứng dụng tiếp tục, singleton AVSpeechSynthesizer sẽ không còn nói nữa. Sự cố này không xảy ra trên iOS 7.AVSpeechSynthesizer ngừng hoạt động sau khi nền

Khi ứng dụng được backgrounded, được thông báo sau xuất hiện trong nhật ký của tôi:

AVSpeechSynthesizer Audio interruption notification: { 
    AVAudioSessionInterruptionTypeKey = 1; 
} 

tôi khởi tạo AVSpeechSynthesizer như thế này trong phương pháp init của singleton:

self.speechSynthesizer = [[AVSpeechSynthesizer alloc] init]; 
    self.speechSynthesizer.delegate = self; 

và tôi nói utterance như thế này:

AVSpeechUtterance *utt = [[AVSpeechUtterance alloc] initWithString:dialogue]; 
utt.voice = [AVSpeechSynthesisVoice voiceWithLanguage:voice]; 

utt.pitchMultiplier = pitch; 
utt.rate = rate; 
utt.preUtteranceDelay = preDelay; 
utt.postUtteranceDelay = postDelay; 
utt.volume = volumeSetting; 

[self.speechSynthesizer speakUtterance:utt]; 

Có ai thấy bất cứ điều gì giống như thế này trên iOS 8?

+0

Điều này xảy ra trên mô phỏng và thiết bị chính nó? – FiddleMeRagged

+0

Trên thiết bị - AVSpeechSynthesizer không hoạt động ở chế độ mô phỏng (ít nhất là trong Xcode 6.0). – bmueller

+0

AVSpeechSynth hoạt động trong trình mô phỏng trong phiên bản beta 8.2 5. –

Trả lời

12

Tôi dành cả ngày để theo dõi sự điên rồ này và tôi nghĩ mình đã tìm được giải pháp. Vấn đề của tôi là AVSpeechSynthesizer sẽ hoạt động tốt ở nền trước và nền sau khi có âm thanh khác cho đến khi cuộc gọi điện thoại diễn ra.

Tại thời điểm đó, nói sẽ ngừng hoạt động âm thầm mà không có bất kỳ lỗi nào. Tất cả các đối tượng vẫn còn đó nhưng các cuộc gọi đại biểu sẽ không được gọi, không bắt đầu cũng không kết thúc.

Tôi nhận thấy rằng với các cuộc gọi điện thoại, ứng dụng của tôi sẽ nhận được thông báo về AudioRouteChanged. Vì vậy, khi điều đó xảy ra, tôi sẽ tái tạo thiết lập giọng nói: về cơ bản tiêu hủy hiện tại AVSpeechSynthesizer và tạo lại nó một lần nữa. Từ đó trở đi, việc nói sẽ tiếp tục hoạt động. Nó thậm chí sẽ hoạt động trong suốt cuộc gọi điện thoại :)

+0

Vâng, công trình này! Cảm ơn bạn đã dành thời gian để sắp xếp điều này. Ồ, và tên thông báo chính xác là 'AVAudioSessionRouteChangeNotification' cho bất kỳ ai nhận được điều này trong tương lai. – bmueller

+0

Bản hack này có hoạt động không? Tôi có cùng một kịch bản nhưng trong trường hợp của tôi điều này không hoạt động. iOS8.3/Xcode 6.3.2.Tôi đang sử dụng AVAudioSessionCategoryPlayback + AVAudioSessionCategoryOptionDuckOthers – Ivan

+0

Tôi đã phải sử dụng: var err: NSError? = nil AVAudioSession.sharedInstance(). setCategory (AVAudioSessionCategoryAmbient, error: & err) – BaseZen

0

Sau khi điều tra thêm, có vẻ như AVSpeechSynthesizer đang bẻ khóa khi ứng dụng được khởi chạy trong nền (do tìm nạp nền hoặc bất kỳ thứ gì). Một cuộc gọi đơn giản để kiểm tra xem ứng dụng hiện có đang hoạt động hay không trước khi nói giải quyết vấn đề.

if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) 
    [self.speechSynthesizer speakUtterance:utt]; 
+0

Nhưng sử dụng điều này, về cơ bản bạn ngăn chặn việc nói ở chế độ nền, không lý tưởng, đặc biệt là đối với các ứng dụng thể dục. AVSpeechSynth hoạt động trong nền chỉ tốt cho đến khi cuộc gọi điện thoại, sau đó AVSpeechSynth cuộc gọi đại biểu không xảy ra cũng không nói được thực hiện ở tất cả. –

2
  1. Bạn phải đặt "Âm thanh và AirPlay" ở chế độ nền.
  2. Bạn phải cấu hình phiên âm thanh trong appdelegate của bạn:

    NSError *error = NULL; 
    AVAudioSession *session = [AVAudioSession sharedInstance]; 
    [session setCategory:AVAudioSessionCategoryPlayback error:&error]; 
    if(error) { 
        // Do some error handling 
    } 
    [session setActive:YES error:&error]; 
    if (error) { 
        // Do some error handling 
    } 
    

(Xem bài đăng này: https://stackoverflow.com/a/19200177/330067)

Các vấn đề liên quan