为什么我不能用滑块值控制Apple macOS Speech Synthesis音频单元?

Aur*_*zka 7 speech-synthesis avspeechsynthesizer audiokit

我努力把苹果语音合成音频单元的东西(只适用于MacOS的,不是的iOS)到AudioKit,我已经建立了一个AKSpeechSynthesizer类(最初由wangchou在此创建pull请求)和演示项目都可以在发展AudioKit的分支.

我的项目与这个可可语音合成示例非常相似,但在这个项目中,速率变量可以在每分钟的低字数(40)到高数字(300 ish)之间平滑变化和变化.但是,我的项目以默认速率175开始,任何更改都会使速率降低到爬行速度 - 除非您将其更改为350,否则速度会超快.

我不知道我在做什么与这个例子有什么不同,因为两个项目都依赖

SetSpeechProperty(speechChannel, kSpeechRateProperty, newRate as NSNumber?)
Run Code Online (Sandbox Code Playgroud)

设定费率.

这是我的实施工作.

最大的区别是我的合成器被设置为音频单元,而我认为工作示例只使用默认输出到扬声器.

频率(音调)或调制(pitchMod)的其他参数也表现出奇怪的行为,但它们不那么引人注意,而且这两个项目的工作都有点滑稽.

有人可以告诉我为什么我的工作不起作用或通过拉取请求修复它?任何帮助将在代码中受到高度赞赏和归属.

谢谢!

Nic*_*and 4

似乎速率、音调和调制语音属性需要是整数值,没有小数部分,才能正常工作。

CocoaSpeechSynthesis 示例实际上表现出相同的行为,但将速率字段初始化为整数值。例如,要重现该问题,请尝试先将速率设置为 333,然后再设置为 333.3。

其他音高和调制参数似乎对小数部分同样挑剔,并且似乎只有在设置为整数值时才能产生合理的结果。

不幸的是,我找不到任何在线参考文档材料来证实这些发现,但这里有一个补丁,可以让 3 个语音参数在 SpeechSynthesizer 示例项目中运行:

diff --git a/AudioKit/Common/Nodes/Generators/Speech Synthesizer/AKSpeechSynthesizer.swift b/AudioKit/Common/Nodes/Generators/Speech Synthesizer/AKSpeechSynthesizer.swift
index 81286b8fb..324966e13 100644
--- a/AudioKit/Common/Nodes/Generators/Speech Synthesizer/AKSpeechSynthesizer.swift 
+++ b/AudioKit/Common/Nodes/Generators/Speech Synthesizer/AKSpeechSynthesizer.swift 
@@ -47,7 +47,7 @@ open class AKSpeechSynthesizer: AKNode {
                return
            }
            AKLog("Trying to set new rate")
-            let _ = SetSpeechProperty(speechChannel, kSpeechRateProperty, newRate as NSNumber?)
+            let _ = SetSpeechProperty(speechChannel, kSpeechRateProperty, newRate.rounded() as NSNumber?)
        }
    }

@@ -70,7 +70,7 @@ open class AKSpeechSynthesizer: AKNode {
                return
            }
            AKLog("Trying to set new freq")
-            let _ = SetSpeechProperty(speechChannel, kSpeechPitchBaseProperty, newFrequency as NSNumber?)
+            let _ = SetSpeechProperty(speechChannel, kSpeechPitchBaseProperty, newFrequency.rounded() as NSNumber?)
        }
    }

@@ -93,7 +93,7 @@ open class AKSpeechSynthesizer: AKNode {
                return
            }
            AKLog("Trying to set new modulation")
-            let _ = SetSpeechProperty(speechChannel, kSpeechPitchModProperty, newModulation as NSNumber?)
+            let _ = SetSpeechProperty(speechChannel, kSpeechPitchModProperty, newModulation.rounded() as NSNumber?)
        }
    }
Run Code Online (Sandbox Code Playgroud)

只需额外调用 3 次 Swift 的数字舍入方法即可。