如何在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
相关产品推荐
相关产品推荐

