在 IOS 10.0 或更高版本上本地化表情符号的阅读

Localizing the Reading of Emoji on IOS 10.0 or Higher

我注意到 IOS 似乎无法在 IOS 10.0 或更高版本上本地化表情符号的阅读(通过 AVSpeechSynthesizer),但它 确实如此 似乎在 IOS 9.3 或更低版本上正确执行。

如果您通过向设置为英语的 AVSpeechSynthesizer 发送字符串“”告诉它说出表情符号,它会说 "Grinning face with normal eyes."

当您将合成器的语音语言更改为英语以外的任何语言(例如法语)并发送相同的表情符号时,它应该说 "Visage souriant avec des yeux normaux,",这与 IOS 相同9.3 或更低版本,但在 IOS 10.0 及更高版本上,它只是以法语口音阅读英文文本 ("Grinning face with normal eyes")。

我在下面想出了一个 "playground" 来展示我是如何得出这个结论的...尽管我希望我遗漏了什么或做错了什么。

要重现此问题,请在 XCode 中创建新项目并将按钮附加到 speakNext() 函数。

运行 在模拟器 运行 IOS 9.3 或更低版本上,然后在 IOS 10.0 或更高版本上执行相同操作。

你能解释一下吗?

import UIKit
import AVKit

class ViewController: UIViewController {

    var counter = 0

    let langArray = ["en","fr","de","ru","zh-Hans"]

    let synth = AVSpeechSynthesizer()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func speakNext(_ sender: Any) {
        print("testing \(langArray[counter])")
        let utterance = AVSpeechUtterance(string: "")
        utterance.voice = AVSpeechSynthesisVoice(language: langArray[counter])
        counter += 1
        if (counter > 4) { counter = 0 }
        synth.speak(utterance)
    }

}

看起来,无论好坏,表情符号现在都是根据用户的首选语言来阅读的。例如,如果您 运行 在设备上切换到法语,那么即使语音合成语音是英语,表情符号也会以法语读出。值得注意的是,有些语言似乎不会读出表情符号。令人惊讶的是,这似乎适用于日本人。

所以你能改变它吗?

嗯,有点像,但我不确定是 Apple-approved。您可以在UserDefaults.standard中设置"AppleLanguages"键。此数组中的第一种语言 当调用 UIApplicationMain 时 将是用于阅读表情符号的语言。这意味着如果您在应用程序中更改该值,它将在应用程序下次启动时才会生效。

目前还不清楚这是错误还是有意为之,但听上去肯定很刺耳。可能值得向 Apple 提交雷达或反馈或他们现在所说的任何内容。

更新:问题似乎已在 iOS 13.2 中修复!耶!

更新:iOS 13 正式发布后,该问题已 eclipsed/superceded 被更糟糕的问题 (iOS 13 Text To Speech (TTS - AVSpeechSynthesisVoice) crashes for some users after update) 解决。

//原post:

在通过反馈助手通知 Apple 后,这似乎是 IOS 10 中以某种方式引入的错误,在 IOS 的三个连续版本中未被注意到。

使用 IOS 13 beta 5 (17A5547d) 测试后,问题没有出现。

他们声称此问题已从此时起明确解决。