【译】语音合成器

501 阅读5分钟

原文链接 AVSpeechSynthesizer - NSHipster

尽管我们离***哈尔或她还有很长的路要走,但我们***不应该忘记外面有数十亿人可以和我们交谈。

在现存的数千种语言中,一个人有幸在一生中只掌握了几种语言。然而,在人类共存的几千年里,文明通过一个由口译员、翻译员、学者和在父母混合语言传统中长大的孩子组成的特设网络,成功地使事情运转起来(或多或少)。我们已经看到,相互理解促进和平,相反,相互不理解会破坏人际关系的稳定。

计算语言学的发展应该与我们今天的国际社会的出现相吻合。联合国和欧洲联盟等政府间组织致力于相互理解,产生了大量**平行文本**,这些文本构成了现代语言翻译技术的基础。

不同语言的说话者之间的计算机辅助交流包括三个任务:将所说的话转录成文本,将文本翻译成目标语言,以及为翻译的文本合成语音。

本文重点介绍ios如何处理最后一个问题:语音合成。

AV Speech Synthesizer在ios 7中推出,可在mac OS 10.14 Mojave中使用,从文本中产生语音。

要使用它,请创建一个AV Speech Utterance对象,其中包含要讲的文本,并将其传递给Speech Utterance(_:)方法:

import AVFoundationlet string = "Hello, World!"let utterance = AVSpeechUtterance(string: string)let synthesizer = AVSpeechSynthesizer()synthesizer.speakUtterance(utterance)

您可以通过配置AV Speech Utterance对象上的相应属性来调整音量、音高和语速。

说话时,合成器可以在下一个单词边界上暂停,这比停止中间元音更不刺耳的用户体验。

synthesizer.pauseSpeakingAtBoundary(.word)

支持的语言

Mac OS 9用户无疑会对旧系统的声音有着美好的回忆——尤其是新奇的声音,比如泡泡、大提琴、管风琴和坏消息。

本着质量胜于数量的精神,每种语言都为每个主要地区提供了发言权。因此,AV Speech Synthesis Voice没有要求使用“Fred”或“Markus”,而是要求使用en-US或de-DE。

画外音支持超过30种不同的语言。有关可用内容的最新列表,请调用AV Speech Synthesis Voice类方法演讲语音()或查看此**支持**文章。

默认情况下,AV Speech Synthesizer将根据用户当前的语言偏好使用语音说话。为了避免在巴黎听起来像一个刻板**的美国人**,通过选择AV Speech Synthesis Voice设置一个明确的语言。

let string = "Bonjour!"let utterance = AVSpeechUtterance(string: string)utterance.voice = AVSpeechSynthesisVoice(language: "fr")

基础和其他系统框架中的许多API使用ISO 681代码来识别语言。然而,AV Speech Synthesis Voice采用**IETF语言标记,如指定的BCP 47文档系列**。如果发音字符串和语音不是同一种语言,语音合成就会失败。

并非所有语言都在设备上预加载,在合成语音之前,可能必须在后台下载。

自定义发音

在它首次在ios上亮相几年后,AV Utterance增加了控制特定单词发音的功能,这对专有名称特别有帮助。

要利用它,可以使用init(属性String:)而不是init(string:)构造一个话语。初始化器扫描属性字符串,查找与AV Speech Synthesis IP ANotation Atement关联的任何值,并相应地调整发音。

import AVFoundationlet text = "It's pronounced 'tomato'"let mutableAttributedString = NSMutableAttributedString(string: text)let range = NSString(string: text).range(of: "tomato")let pronunciationKey = NSAttributedString.Key(rawValue: AVSpeechSynthesisIPANotationAttribute)// en-US pronunciation is /tə.ˈme͡ɪ.do͡ʊ/mutableAttributedString.setAttributes([pronunciationKey: "tə.ˈme͡ɪ.do͡ʊ"], range: range)let utterance = AVSpeechUtterance(attributedString: mutableAttributedString)// en-GB pronunciation is /tə.ˈmɑ.to͡ʊ/... but too bad!utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")let synthesizer = AVSpeechSynthesizer()synthesizer.speak(utterance)

美丽。🍅

当然,在撰写本文时,该属性**没有记录的,所以除非您在2018年WWDC观看了本次会议**,否则您不会知道您从维基百科获得的IPA无法正常工作。

要获得AV Speech Utterance可以理解的IPA符号,您可以打开设置应用程序,导航到辅助功能>画外音>语音>发音,然后……自己说!

连接到演讲事件

AV Speech Synthesizer最酷的功能之一是它如何让开发人员挂钩到语音事件。当语音合成器开始或结束、暂停或继续时,以及当说出话语的每个范围时,可以调用符合AV Speech Synthesizer委托的对象。

例如,除了合成语音话语之外,一个应用程序还可以在标签中显示该话语,并突出显示当前正在说的单词:

var utteranceLabel: UILabel!// MARK: AVSpeechSynthesizerDelegateoverride func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,  willSpeakRangeOfSpeechString characterRange: NSRange,                                    utterance: AVSpeechUtterance){    self.utterranceLabel.attributedText =        attributedString(from: utterance.speechString,                         highlighting: characterRange)}

查看此**游乐场**,了解所有支持语言的实时文本高亮显示示例。

任何去陌生地方旅行的人都会带着对交流意味着什么的深刻理解回来。这与高中教语言的方式完全不同:不是性别和案例,而是情感和耐心,坚持每一点理解。人们对两个人能用手势和面部表情交流的程度感到震惊。当哑剧失败时,人们也会感到沮丧。

在我们的现代,我们有机会在一个由集体计算基础设施增强的世界中走出去。在我们的设备上配备了AV Speech Synthesizer和无数其他语言技术,我们从未像现在这样有能力打破分裂我们物种的最大力量。

如果这不是宇宙毁灭,那么我不知道是什么。