3

当我的应用程序的所有用户执行某些操作时,我需要向他们宣布一些文本。为此,我使用AVSpeechSynthesizer. 这很好用,除非您使用 VoiceOver 来执行操作。因为 VoiceOver 是在向用户公布一些系统提供的信息AVSpeechUtterance,所以同时播放 my,所以声音是重叠的。如何将我的语音进行排队,以便在 VoiceOver 完成讲话后才播放它?

4

3 回答 3

4

您可以通过观察 VoiceOver 活动来实现这一点。首先添加一个 Voiceover 通知观察者:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(voiceOverDidStop:) name:UIAccessibilityAnnouncementDidFinishNotification object:nil];

然后,在指定的方法中:

-(void)voiceOverDidStop:(NSNotification*)n {
    NSString* msg;
    NSNumber* finished;

    msg = [[n userInfo] objectForKey:UIAccessibilityAnnouncementKeyStringValue];
    finished = [[n userInfo] objectForKey:UIAccessibilityAnnouncementKeyWasSuccessful];

    if(finished) {
        // send the AVSpeechSynthsizer message
    }
}

请记住在处理您的应用程序之前删除观察!

您可以使用的另一种方法(如果适用)是编辑用户正在使用的对象的accessibilityLabel和属性。accessibilityHint将这些属性设置为,@""以便 VoiceOver 知道该对象无话可说。

希望这对您有所帮助,即使我的回答来晚了:)

于 2015-11-01T09:13:29.637 回答
1

检查 VoiceOver 是否正在运行,并UIAccessibilityAnnouncementNotification与您的消息一起发布,而不是使用AVSpeechSynthesizer.

于 2015-03-29T02:07:24.977 回答
0

我已经完成了这个asyncAfter,代码是 SwiftUI,但我希望你明白:

Button {
    if !UIAccessibility.isVoiceOverRunning {
        readOutLoud(translation)
    }
} label: {
    Image(systemName: "speaker.wave.3.fill")
}
.accessibilityElement()
.accessibilityLabel("Listen")
.accessibilityAction {
    DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
        readOutLoud(translation)
    })
}

当按下按钮且 VoiceOver 未激活时,该按钮会读取文本。

当 VoiceOver 被激活时,文本将以accessibilityAction所需的延迟阅读。

于 2021-06-30T20:03:31.083 回答