如何实现AVSpeechUtterance按10%步长在50%-150%正常语速区间调节
AVSpeechUtterance 50%-150%相对语速调节实现方案
核心问题说明
AVSpeechUtterance的rate属性并非线性对应实际语速,数值变化符合幂律分布,这也是你将rate从0.5调整到0.6时感知到语速翻倍的核心原因。官方提供的三个常量才是语速调节的基准值,不要直接对默认值0.5做加减调整。
基准常量说明与访问
如果无法访问官方常量,请先确认你已经在代码中导入了AVFoundation框架,导入后可正常访问以下三个系统基准值:
AVSpeechUtteranceMinimumSpeechRate:系统支持的最低语速AVSpeechUtteranceDefaultSpeechRate:系统默认正常语速,即你提到的0.5,是相对调节的基准AVSpeechUtteranceMaximumSpeechRate:系统支持的最高语速
不同语言的常量写法略有差异:
- Swift中写法为
AVSpeechUtterance.minimumSpeechRate、AVSpeechUtterance.defaultSpeechRate、AVSpeechUtterance.maximumSpeechRate - Objective-C中写法为上述全大写常量形式
相对语速映射实现
我们需要将0.5(50%)~1.5(150%)的相对倍率,按感知线性映射到系统的语速区间,步长10%对应可选倍率为0.5、0.6、……1.4、1.5共11档。
Swift 代码示例
import AVFoundation // 基准值初始化 private let minSysRate = AVSpeechUtterance.minimumSpeechRate private let defaultSysRate = AVSpeechUtterance.defaultSpeechRate private let maxSysRate = AVSpeechUtterance.maximumSpeechRate /// 输入相对正常语速的倍率(0.5~1.5),返回可直接赋值给AVSpeechUtterance的rate值 func getSpeechRate(for relativeMultiplier: Float) -> Float { if relativeMultiplier < 1.0 { // 低于正常语速:映射到[最低语速, 默认语速]区间 let ratio = (relativeMultiplier - 0.5) / 0.5 return minSysRate + (defaultSysRate - minSysRate) * ratio } else { // 高于正常语速:映射到[默认语速, 最高语速]区间 let ratio = (relativeMultiplier - 1.0) / 0.5 return defaultSysRate + (maxSysRate - defaultSysRate) * ratio } }
Objective-C 代码示例
#import <AVFoundation/AVFoundation.h> // 基准值初始化 float const minSysRate = AVSpeechUtteranceMinimumSpeechRate; float const defaultSysRate = AVSpeechUtteranceDefaultSpeechRate; float const maxSysRate = AVSpeechUtteranceMaximumSpeechRate; /// 输入相对正常语速的倍率(0.5~1.5),返回可直接赋值给AVSpeechUtterance的rate值 - (float)getSpeechRateForRelativeMultiplier:(float)relativeMultiplier { if (relativeMultiplier < 1.0) { float ratio = (relativeMultiplier - 0.5) / 0.5; return minSysRate + (defaultSysRate - minSysRate) * ratio; } else { float ratio = (relativeMultiplier - 1.0) / 0.5; return defaultSysRate + (maxSysRate - defaultSysRate) * ratio; } }
使用示例
需要设置120%的语速时,直接传入相对倍率1.2即可:
// Swift 示例 let utterance = AVSpeechUtterance(string: "测试文本") utterance.rate = getSpeechRate(for: 1.2)
// Objective-C 示例 AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:@"测试文本"]; utterance.rate = [self getSpeechRateForRelativeMultiplier:1.2];
内容的提问来源于stack exchange,提问作者Anatolii Rudenko
相关产品推荐
相关产品推荐

