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

如何提升AVSpeechSynthesizer的语音播放音量?

解决AVSpeechSynthesizer在旧设备上音量过低的问题

针对旧设备上AVSpeechSynthesizer输出音量极低的问题,可以尝试以下几种方案:

1. 配置正确的音频会话类别

旧设备的音频会话默认设置可能限制媒体播放音量,将音频会话类别设置为.playback可优先保障媒体音频输出,不受系统静音开关影响。建议在初始化语音合成器前或朗读操作前执行配置:

import AVFoundation

do {
    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
    print("音频会话配置失败: \(error)")
}

2. 利用音频引擎添加增益放大

通过AVAudioEngine对语音合成的输出信号添加增益处理,直接放大音频音量,可绕过部分系统音量限制:

import AVFoundation

// 初始化音频引擎和增益节点
let audioEngine = AVAudioEngine()
let mixer = audioEngine.mainMixerNode
let gainNode = AVAudioUnitGain()
gainNode.gain = 8.0 // 增益值可根据实际测试调整,避免出现破音

// 连接音频节点
audioEngine.attach(gainNode)
audioEngine.connect(mixer, to: gainNode, format: mixer.outputFormat(forBus: 0))
audioEngine.connect(gainNode, to: audioEngine.outputNode, format: mixer.outputFormat(forBus: 0))

// 启动音频引擎
do {
    try audioEngine.start()
} catch {
    print("音频引擎启动失败: \(error)")
}

// 将语音合成器的输出路由到音频引擎
m_synthesizer.outputNode.installTap(onBus: 0, bufferSize: 1024, format: m_synthesizer.outputNode.outputFormat(forBus: 0)) { buffer, time in
    mixer.scheduleBuffer(buffer, at: time, options: .interrupts, completionHandler: nil)
}

停止朗读时需清理资源,避免泄漏:

m_synthesizer.stopSpeaking(at: .immediate)
audioEngine.stop()
m_synthesizer.outputNode.removeTap(onBus: 0)

3. 引导用户调整系统音量

旧设备可能存在系统音量偏低的情况,可检测当前音量,若低于阈值则提示用户手动调高:

import MediaPlayer

// 获取当前系统音量
let volumeSlider = MPVolumeView().subviews.compactMap { $0 as? UISlider }.first
if let currentVolume = volumeSlider?.value, currentVolume < 0.4 {
    // 弹出提示引导用户调高系统音量
}

注意:苹果禁止直接通过代码修改系统音量,仅能提供提示或界面让用户手动操作。

4. 更换语音合成包

部分旧设备的默认语音包本身音量较低,可尝试切换到其他可用语音包:

// 获取当前语言对应的所有可用语音
let targetLanguage = Locale(identifier: language).languageCode ?? "en-US"
let availableVoices = AVSpeechSynthesisVoice.speechVoices().filter { $0.language == targetLanguage }

// 优先选择适配语音
if let suitableVoice = availableVoices.first {
    utterance.voice = suitableVoice
}

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:01:27