You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:27:04