当前位置: 首页 > news >正文

C#和微软System.Speech.Synthesis库实现语音合成

C#和微软System.Speech.Synthesis库实现语音合成


一、基础语音合成示例

using System;
using System.Speech.Synthesis;class Program
{static void Main(){using (SpeechSynthesizer synth = new SpeechSynthesizer()){// 1. 选择语音(需系统已安装对应语音包)synth.SelectVoice("Microsoft Zira Desktop"); // 中文语音// synth.SelectVoice("Microsoft David Desktop"); // 英文语音// 2. 设置语音属性synth.Rate = 0;    // 语速(-10到10,默认5)synth.Volume = 90; // 音量(0-100)// 3. 同步朗读文本synth.Speak("您好,欢迎使用微软语音合成技术!");// 4. 异步朗读(不阻塞主线程)synth.SpeakAsync("正在异步播放语音...");Console.WriteLine("异步朗读已启动...");}}
}

二、高级功能实现

2.1 使用SSML控制语音效果
public string GenerateSsml(string text)
{return $@"<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='zh-CN'><voice name='Microsoft Zira Desktop'><prosody pitch='+10%' rate='fast'><emphasis level='strong'>重要通知:</emphasis>{text}</prosody></voice></speak>";
}// 使用示例
synth.SpeakSsml(GenerateSsml("系统检测到异常操作!"));
2.2 语音文件保存
public void SaveToWav(string text, string filePath)
{using (SpeechSynthesizer synth = new SpeechSynthesizer()){// 设置音频格式SpeechAudioFormatInfo format = new SpeechAudioFormatInfo(22050, // 采样率AudioBitsPerSample.Sixteen, // 16位AudioChannel.Mono); // 单声道// 保存到文件synth.SetOutputToWaveFile(filePath, format);synth.Speak(text);synth.SetOutputToNull(); // 释放资源}
}// 使用示例
SaveToWav("请检查设备连接状态!", "output.wav");

三、完整功能类封装

public class VoiceAssistant
{private readonly SpeechSynthesizer _synth;public VoiceAssistant(){_synth = new SpeechSynthesizer();InitializeVoices();}private void InitializeVoices(){// 获取系统所有语音var voices = _synth.GetInstalledVoices();foreach (var voice in voices){Console.WriteLine($"可用语音: {voice.VoiceInfo.Name} [{voice.VoiceInfo.Language}]");}}public void Configure(VoiceGender gender = VoiceGender.Neutral, VoiceAge age = VoiceAge.Adult,int rate = 0,int volume = 100){_synth.SelectVoiceByHints(gender, age);_synth.Rate = rate;_synth.Volume = volume;}public void Speak(string text){try{_synth.Speak(text);}catch (Exception ex){Console.WriteLine($"语音合成失败: {ex.Message}");}}public void Shutdown(){_synth.Dispose();}
}// 使用示例
var assistant = new VoiceAssistant();
assistant.Configure(VoiceGender.Female, VoiceAge.Adult, rate: -2);
assistant.Speak("正在为您查询天气情况...");

四、异常处理与资源管理

public class SafeTtsService : IDisposable
{private SpeechSynthesizer _synth;private bool _disposed = false;public SafeTtsService(){try{_synth = new SpeechSynthesizer();}catch (PlatformNotSupportedException){throw new InvalidOperationException("当前系统不支持语音合成功能");}}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!_disposed){if (disposing){_synth?.Dispose();}_disposed = true;}}
}

五、关键配置说明

  1. 语音引擎安装

    • Windows 10/11 默认包含中文语音包(如Microsoft Huihui、Microsoft Zira)
    • 如需更多语音,可通过微软商店安装"Microsoft Speech Language Pack"
  2. SSML支持

    • 支持语调控制(<prosody>)、强调(<emphasis>)、静默(<break>)
    • 示例:<break time='500ms'/> 添加0.5秒停顿
  3. 性能优化

    // 启用异步处理避免界面卡顿
    private async Task AsyncSpeak(string text)
    {await Task.Run(() => _synth.Speak(text));
    }
    

参考项目 C# 语音合成例子源码(TTS微软库) www.youwenfan.com/contentcsh/57531.html

六、完整项目结构

- VoiceApp.sln├─ VoiceCore/              # 核心逻辑│   ├─ TtsService.cs       # 语音服务类│   └─ VoiceConfig.cs      # 配置管理├─ Models/                # 数据模型│   └─ VoiceSettings.cs    # 语音参数配置└─ Views/                 # 用户界面└─ MainForm.xaml       # 控制面板

七、部署注意事项

  1. 目标系统要求

    • Windows 10 1809 或更高版本
    • .NET Framework 4.7.2+
    • 安装语音合成引擎(通过控制面板 > 语音识别 > 安装语音包)
  2. 安装包配置

    <!-- app.manifest -->
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"><application><!-- 支持高DPI显示 --><supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/></application>
    </compatibility>
    
http://www.dtcms.com/a/395292.html

相关文章:

  • C++概述 (一)
  • 【开题答辩全过程】以 基于springboot的高校仪器共享管理系统设计和实现为例,包含答辩的问题和答案
  • 【python】FastAPI简介
  • IDEA lombok注解无效的问题,运行时提示java: 找不到符号或者方法
  • Windows 系统部署 Kronos 金融 K 线基础模型——基于 EPGF 架构
  • 010 Rust流程控制
  • MyBatisPlus快速入门:简化CRUD操作
  • 网络编程套接字(三)---简单的TCP网络程序
  • 背景建模(基于视频,超炫)项目实战!
  • ios26版本回退到ios18
  • OpenCV直方图比较:原理与四种方法详解
  • OpenCV - 图像金字塔
  • 寄存柜频繁维护还卡顿?杰和IB2-281主板:智能化升级高效省心
  • 海外短剧系统开发:多语言适配与跨地区部署的架构实践
  • JVM内存模型详解:看内存公寓如何分配“房间“
  • 【论文阅读】4D-VLA:时空视觉-语言-动作预训练与跨场景校准
  • 【论文阅读】MDM : HUMAN MOTION DIFFUSION MODEL
  • 【论文阅读】RynnVLA-001:利用人类示范改进机器人操作
  • Leecode hot100 - 105.从前序与中序遍历序列构造二叉树
  • 联邦学习论文分享:Federated Learning with GAN-based Data Synthesis for Non-IID Clients
  • 绕过百度网盘无限制下载
  • 【自记】PyCharm 更换阿里云国内源教程
  • 【Axure原型分享】区间K线图
  • javascript之Es6八股文
  • npm和pnpm命令大全
  • kali下安装beef-xss报错-启动失败-简单详细
  • 政策法规下的LLM安全:合规之路
  • 《第21课——C typedef:从Java的“实名制”到C的“马甲生成器”——类型伪装术与代码整容的艺术》
  • 【每天一个知识点】什么是知识库?
  • 豆包·Seedream 4.0深度测评:4K多模态时代的图像创作革命(图文增强版)