【问题标题】:How can I play a test voice guidance sentence with the same voice as NMANavigationManager (HERE SDK)?如何使用与 NMANavigationManager (HERE SDK) 相同的语音播放测试语音指导语句?
【发布时间】:2021-05-17 20:47:13
【问题描述】:

我正在使用 Here SDK 在 Xcode 中开发一个 iOS 项目。我正在使用高级版(v3.17)。 在我的应用程序的“设置”屏幕中,用户可以选择 SDK 正在使用的“语音”(我通过 NMAVoiceCatalogvoicePackages 属性获取该列表。)

我想在用户选择语音时播放一个小句子(例如“立即转身”),以便他们在喜欢与否时立即获得反馈。

现在,我知道 NMAAudioManager 有一个方法 playOutput 可以播放预先录制的声音文件或 tts 字符串。太好了,但现在我的问题是:

如何确保NMAAudioManager.sharedInstance().play( 方法与NMANavigationManager 使用相同的声音?

请务必在此处注意 tts 语音和预录语音之间的区别。

预先录制的声音 我想这是一个预先录制的 mp3 或 wav 文件的资源包。我只需要知道我可以使用的一个或多个声音文件的 url。例如。句子“turn right now”的声音文件。我想所有语言的所有声音的文件名都是相同的(虽然不确定)。是否有可用声音文件及其名称的列表?或者您能否给我一些声音文件名(以及 SDK 中的 URL),以便我可以通过 NMAAudioManager 将它们作为测试声音播放?

tts 声音 对于这些声音,我可以用每种支持的语言创建一个句子并将其提供给NMAAudioManager.sharedInstance().play( 方法。我会为那个句子创建一个“NMATTSAudioOutput”。但是,我需要将正确的AVSpeechSynthesisVoice 设置为该“NMATTSAudioOutput”实例的语音属性。正确的意思是 NMANavigationManager 正在使用的 AVSpeechSynthesisVoice。我试过使用AVSpeechSynthesisVoice(language: voicePackage.languageCode),但这并没有提供与NMANavigationManager 使用的相同的AVSpeechSynthesisVoice。例如。英国英语 tts voicePackage 与美国英语 AVSpeechSynthesisVoice 一起播放。你能和我分享一下NMANavigationManager是如何从NMAVoicePackage属性中选择AVSpeechSynthesisVoice的吗?

【问题讨论】:

    标签: ios swift here-api heremaps-ios-sdk


    【解决方案1】:

    预先录制的声音

    获取示例的最佳方式是使用 HERE SDK。因为将来可以更改语音服务 URL。从目录安装语音包(id:83101)并在您的应用目录中找到wav文件:

    /Documents/heremaps/diskcache/voices/es-MX_male/mexican_male/g5turns_left_002e
    

    HERE SDK 使用 wav 文件内容初始化 AVAudioPlayer 并调用 play() 函数。

    TTS 语音

    NMANavigationManager 使用类似的东西:

    NMATTSAudioOutput *output = [NMATTSAudioOutput audioOutputWithText:text];
    output.source = NMAAudioOutputSourceGuidance;
    output.voice = [AVSpeechSynthesisVoice voiceWithLanguage:self.voicePackage.languageCode];
    output.speechRate = AVSpeechUtteranceDefaultSpeechRate;
    output.pitchMultiplier = 1.0;
    
    [[NMAAudioManager sharedAudioManager] playOutput:output];
    

    注意,后台有很多 lua 脚本和算法,让语音引导更加流畅和先进。

    【讨论】:

    • 我有这个,但它不起作用。例如,如果我选择语音包英语(英国)宣布街道名称,上面的代码将选择与我选择英语(美国)宣布街道名称时相同的声音。不知何故,当我设置 voicePackage NMANavigationManager 时,AVSpeechSynthesisVoice 的选择不同。
    • 因此,packageId 206 - 英语(美国) - 具有语言代码“en-US”。当我选择这个声音时,NMANavigationmanager 和 NMAAudioManager 有相同的声音。 packageId 201 - 英语(英国) - 语言代码为“en”。当我选择这个声音时,NavManager 和 AudioManager 有不同的声音。 NavManager 具有正确的声音(英国口音),但 AudioManager 具有与语言代码“en-US”相同的美国声音。 NavManager 不知何故知道“en”应该是“en-UK”,但是我没有看到任何具有该值的 NMAVoicePackage 属性。 NavManager 如何从 NMAVoicePackage 导出正确的语言代码?
    • 对于预先录制的声音,我遇到了类似的问题。如何找出目录名称(在您的示例 es-MX_male 中)?这并不总是直截了当的。例如。对于 packageId 405000 - Espanol (América Latina),语言代码为 es-419,但创建的目录名为 es-CO_female。这个名字是从哪里来的?
    • 我想如果 NMAAudioManager 或 NMANavigationManager 有一个函数“playDemoInstruction(forVoicePackage: NMAVoicePackage)”使用与 NMANavigatiorManager 在播放实际语音指导指令时使用的完全相同的声音,那就太好了。如果有任何简单的方法可以做到这一点,而无需分析文件结构、解析 lua 文件等,那就太棒了。
    • 感谢您的详细解释。 NMANavigationManager 使用自己的 voicePackage 属性的语言代码。如果缺少,使用私有 voiceSkin 语言代码 API。预先录制的语音结构可能会有所不同,它们是从语音服务器下载的安装包。因此,您将手动下载所有必需的语言并找到所需的 wav。同意这是缺少 API 的肮脏解决方法。如果您需要直接链接到软件包或“playDemoInstruction”功能,请联系 HERE 代表了解详情。
    猜你喜欢
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多