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

如何在C#中调整Azure SpeechSynthesizer的TTS音量且不修改系统音量

调整Azure文本转语音SDK(C#)的单独音量方案

以下是几种仅调整TTS音量、不影响应用内其他音频的可行方案:

1. 利用SSML原生音量控制(推荐)

Azure TTS支持通过SSML的<prosody>标签直接设置音量,这是官方原生方案,无需额外依赖。你可以指定相对音量(如-10dB、+5dB)、绝对音量(如0dB、-60dB)或百分比(如50%)来调整输出音量。

示例代码:

using Microsoft.CognitiveServices.Speech;

var speechConfig = SpeechConfig.FromSubscription("你的订阅密钥", "服务区域");
using var synthesizer = new SpeechSynthesizer(speechConfig, null);

// 构造带音量控制的SSML
var ssmlContent = @"
<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='zh-CN'>
    <prosody volume='-12dB'>
        这是经过音量调整的TTS语音内容
    </prosody>
</speak>";

// 合成并播放
var result = await synthesizer.SpeakSsmlAsync(ssmlContent);

2. 处理合成后的音频流(第三方库方案)

通过获取TTS合成的音频流,使用音频处理库(如NAudio)单独调整音量后再播放,完全隔离TTS音频与应用内其他音频的音量控制。

示例代码:

using Microsoft.CognitiveServices.Speech;
using NAudio.Wave;

var speechConfig = SpeechConfig.FromSubscription("你的订阅密钥", "服务区域");
using var synthesizer = new SpeechSynthesizer(speechConfig, null);

// 合成语音获取音频流
var synthesisResult = await synthesizer.SpeakTextAsync("测试音量调整");
using var audioStream = AudioDataStream.FromResult(synthesisResult);

// 转换为可处理的Wave流并设置音量
using var waveStream = new RawSourceWaveStream(audioStream, new WaveFormat(16000, 16, 1));
using var volumeAdjustStream = new WaveChannel32(waveStream);
volumeAdjustStream.Volume = 0.4f; // 设为原始音量的40%

// 播放处理后的音频
using var waveOut = new WaveOut();
waveOut.Init(volumeAdjustStream);
waveOut.Play();
while (waveOut.PlaybackState == PlaybackState.Playing)
{
    await Task.Delay(100);
}

3. 手动处理PCM音频样本(无依赖方案)

如果不想引入第三方库,可以直接读取TTS输出的PCM格式音频数据,手动缩放每个音频样本的数值来调整音量(适合对音频格式有基础了解的场景)。

示例代码片段:

using Microsoft.CognitiveServices.Speech;

var speechConfig = SpeechConfig.FromSubscription("你的订阅密钥", "服务区域");
using var synthesizer = new SpeechSynthesizer(speechConfig, null);

var synthesisResult = await synthesizer.SpeakTextAsync("手动调整音量测试");
using var audioStream = AudioDataStream.FromResult(synthesisResult);

byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = audioStream.Read(buffer, 0, buffer.Length)) > 0)
{
    // 16位PCM格式:将byte数组转换为short数组
    short[] samples = new short[bytesRead / 2];
    Buffer.BlockCopy(buffer, 0, samples, 0, bytesRead);

    // 缩放音量(0.5为50%音量,可根据需求调整系数)
    for (int i = 0; i < samples.Length; i++)
    {
        samples[i] = (short)(samples[i] * 0.5f);
    }

    // 将调整后的样本转换回byte数组,用于播放或存储
    Buffer.BlockCopy(samples, 0, buffer, 0, bytesRead);
    
    // 此处可将buffer写入音频播放设备或自定义流
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:33:37