我正在从SFVoiceAnalytics "Pitch"中检索值。我的目标是将数据转换为原始基频。根据文档,这些值log_e返回。 当我将 exp(( 应用于返回的值时,我得到以下范围:
- 男声: [0.25, 1.85], 预期: [85, 180]
- 女声: [0.2,1.6], 预期: [165, 255]
为了简单起见,我使用了Apple的示例代码"识别现场音频中的语音"。
感谢您的帮助!!
文档:https://developer.apple.com/documentation/speech/sfvoiceanalytics/3229976-pitch
if let result = result {
// returned pitch values
for segment in result.bestTranscription.segments {
if let pitchSegment = segment.voiceAnalytics?.pitch.acousticFeatureValuePerFrame {
for p in pitchSegment {
let pitch = exp(p)
print(pitch)
}
}
}
// Update the text view with the results.
self.textView.text = result.bestTranscription.formattedString
isFinal = result.isFinal
}
我最近遇到了类似的问题,最终使用了另一种解决方案来检索音高数据。
我为斯威夫特带来了一个名为贝多芬的音高检测库。它实时检测音高,而SFSpeechRecognizer的语音分析仅在转录完成后返回它们。
贝多芬还没有更新为与 Swift 5 配合使用,但我并不觉得让它工作太难。
此外,在挖掘为什么 voiceAnalytics 中的值是这样的时,我通过文档发现音高是一个标准化的音高估计:
该值是每帧的归一化音高估计值的对数(以 e 为底(。
我对此的解释可能是这些值被归一化(除以(基频,所以我不确定是否有可能使用这些数据来恢复绝对频率。它似乎最适合用于传达音高之间的间隔变化。