【问题标题】:AVSpeechSynthesizer with ios8ios8 的 AVSpeechSynthesizer
【发布时间】:2014-10-23 22:41:17
【问题描述】:

您好,有人在 iOS 8 上尝试过 AvSpeechSynthesizer 吗? 我在 Xcode 6 上做了快速应用程序,但没有音频出来,我在 Xcode 5 上运行了同样的应用程序并且运行顺利。

来自http://nshipster.com/avspeechsynthesizer/的示例代码

NSString *string = @"Hello, World!";
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:string];
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"];

AVSpeechSynthesizer *speechSynthesizer = [[AVSpeechSynthesizer alloc] init];
[speechSynthesizer speakUtterance:utterance];

Xcode6 的错误?

== 编辑 === 看起来像 iOS 8 sim 的错误/问题,带有 Xcode6 的 iOS7.1 Sim 工作正常..

【问题讨论】:

  • 听起来你应该file a bug
  • 是的,我刚刚做到了。感谢您的链接
  • 你能让语音合成器说美国以外的语言吗?美国的对我来说很好,但我不能让它说 en-GB、en-AU 等。
  • 最新的 xcode beta 5 可能发生了变化。我从未尝试过 en-GB 或 AU,因为默认 en-US 甚至无法与 beta 1 和 beta 2 一起使用。

标签: ios objective-c avspeechsynthesizer


【解决方案1】:

是的,这是一个错误。从 iOS8 GM 开始,似乎第一次尝试让 AVSpeechSynthesizer 说出 AVSpeechUtterance 会导致静音。

我的解决方法是让 AVSpeechSynthesizer 在初始化后立即说出单字符话语。这将保持沉默,之后您的 AVSpeechSynthesizer 将正常工作。

AVSpeechUtterance *bugWorkaroundUtterance = [AVSpeechUtterance speechUtteranceWithString:@" "];
bugWorkaroundUtterance.rate = AVSpeechUtteranceMaximumSpeechRate;
[self.speechSynthesizer speakUtterance:bugWorkaroundUtterance];

【讨论】:

  • 似乎在话语中添加“preUtteranceDelay”或“postUtteranceDelay”会使问题变得更糟。
  • 只有在我设置了话语的声音时才会出现这个问题,如果没有设置,则会读取文本。为了使解决方法起作用,我刚刚添加了 [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"]。
  • 我也遇到了 iOS8 的问题,即我的应用在升级后失去了 TTS 功能,我在 iPad 的辅助功能选项中启用了 Speak Selection,这似乎让我的应用再次支持 TTS。将尝试您的解决方法并尽快发布。
  • 不确定它是在哪个版本中修复的,但这个问题在 iOS 8.3 中已修复
【解决方案2】:

这在 8.0.2 上仍然是一个问题(Xcode 6.0.1,在 iPad mini 1 上测试)。

如果您将AVSpeechUtterance 的语音属性设置为默认方言以外的语言(在我的情况下,默认为英语(美国)),这只是一个问题。需要明确的是,可以通过强制AVSpeechSynthesizer 首先以非默认语言说出空的@9​​87654323@ 实例来解决此问题。最后一部分很重要。

下面是一个实现修复的简单 getter。

- (AVSpeechUtterance *)utterance {
    if (!_utterance) {
        ...
        _utterance = [AVSpeechUtterance speechUtteranceWithString:@"hello world"];
        [_utterance setRate:0.2f];
        [_utterance setVoice:[AVSpeechSynthesisVoice voiceWithLanguage:language]];

        // iOS 8 bug fix
        AVSpeechUtterance *dummyUtterance = [AVSpeechUtterance speechUtteranceWithString:@" "];
        [dummyUtterance setVoice:[AVSpeechSynthesisVoice voiceWithLanguage:language]];
        [self.synthesizer speakUtterance:dummyUtterance];
    }
    return _utterance;
}

【讨论】:

  • 嗨,马特,您知道是否可以使用 AVSpeechSynthesisVoice 创建自定义语音,或者 Apple 将默认模型的数据存储在哪里(想知道是否有办法破解自定义语音)?谢谢!
【解决方案3】:

编辑:下面关于重新创建合成器的评论似乎仅与 iOS8.0.0 和 GM 相关 - 在 iOS8.0.2 中似乎没有必要,user848555 的解决方法现在对我来说很好。有趣的是,user848555 的解决方法似乎仍然是必要的(至少如果您更改语言),尽管我在其他线程上看到它已在 iOS8.0.2 中修复。

所以这似乎是一个与低质量声音相关的错误 - 它在此处的发行说明中被引用(在此页面上搜索语音合成):

[https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-8.0/][1]

Apple 的官方解决方法是为不起作用的声音下载高质量的声音(默认情况下,一个声音始终是高质量的 - 英语国家的美国英语,可能在其他国家会发生变化),这就是为什么它看起来如果您坚持使用默认语音,则可以正常工作。

如果(像我一样)你不断地改变声音,user848555 的解决方法不能孤立地工作。但是,如果您在每个似乎有效的话语上重新创建 SpeechSynthesizer。这是我的代码(它特定于我的应用程序,因此您需要更改一些内容,但它应该说明这一点)。它使用 user848555 对空白话语的修复以及对每个话语的重新创建。

-(void)speakGerman:(NSString*)text{
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1 ||
        [self.dataController.speakSetting integerValue] == 2) return;

    // iOS8 fix
    speechSynthesizer = [[AVSpeechSynthesizer alloc]init];
    AVSpeechUtterance *bugWorkaroundUtterance = [AVSpeechUtterance speechUtteranceWithString:@" "];
    bugWorkaroundUtterance.rate = AVSpeechUtteranceMaximumSpeechRate;
    [speechSynthesizer speakUtterance:bugWorkaroundUtterance];

    AVSpeechUtterance *utterance;
    
    utterance = [AVSpeechUtterance speechUtteranceWithString:text];
    utterance.voice = germanVoice;
    utterance.rate = 0.2;
    utterance.preUtteranceDelay = 0.0;

    [speechSynthesizer speakUtterance:utterance];
}

阿里[1]:https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-8.0/

【讨论】:

  • FWIW 只是重新创建了 AVSpeechSynthesizer 没有
  • 同意 - iOS8.0.2 中的某些更改使得不再需要重新创建合成器 - 可能会适得其反。我会适当地编辑我上面的评论。
  • 仅供参考:解决方法不适用于空字符串,但适用于单个空格。
【解决方案4】:

这确实是 XCode 6 和 iOS 8.0.2 中的一个错误。只要你配置了“voiceWithLanguage”属性,它就不会第一次说这句话。所以目前的解决方案是先用所需的语言说一个空字符串。

【讨论】:

    【解决方案5】:

    我发现这门课为我解决了问题(或者至少是一个很好的解决方法)...

    https://github.com/dale-moore/iOSTextToSpeech

    【讨论】:

    • 嗨,David,您知道是否可以使用 AVSpeechSynthesisVoice 创建自定义语音,或者 Apple 将默认模型的数据存储在哪里(想知道是否有办法破解自定义语音)?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多