c#如何实现文本转语音TTS_c#文本转语音TTS的几种常见写法

酷浩吖_8039

酷浩吖_8039

2026-04-05

1019人浏览

原创

System.Speech.Synthesis 是 Windows 桌面首选本地 TTS 方案,依赖 SAPI 引擎、无需联网;需确保交互式桌面会话、检查可用语音、合理设置 Rate,异步用 SpeakAsync,录音需 SetOutputToWaveFile 且避免混用输出方式。

c#如何实现文本转语音tts_c#文本转语音tts的几种常见写法

用 System.Speech.Synthesis 实现基础 TTS(Windows 桌面首选)

这是 .NET Framework 3.0+ 自带的本地语音合成方案,无需联网、不依赖第三方服务,适合 WinForms/WPF 桌面应用。它调用的是 Windows 系统内置的 SAPI 引擎(如 Microsoft David/Zira),稳定且延迟低。

常见错误是直接 new SpeechSynthesizer() 后立刻调用 Speak(),结果无声或报错 InvalidOperationException: The operation is not supported on a non-interactive desktop——这通常发生在 Windows 服务或后台线程中(无用户会话)。必须确保代码运行在交互式桌面会话下。

  • 初始化后建议先检查 synth.GetInstalledVoices().Count,确认至少有一个可用语音,否则 Speak() 会静默失败
  • 设置语速用 Rate 属性(范围 -10 到 10),别直接设 0 或负数过大,部分语音引擎不支持极端值
  • 若需异步播放,用 SpeakAsync();若要暂停/继续,必须启用 SetOutputToDefaultAudioDevice() 且不能用 Speak() 同步阻塞
  • 生成音频文件:调用 SetOutputToWaveFile("out.wav") 后再 Speak(),注意路径需有写权限,且不能同时对同一实例混用 SetOutputToDefaultAudioDevice() 和 SetOutputToWaveFile()
var synth = new SpeechSynthesizer();
synth.SetOutputToDefaultAudioDevice();
synth.Speak("你好,这是本地 TTS");

用 Microsoft.CognitiveServices.Speech 调用 Azure TTS(跨平台 + 高质量)

这是微软官方推荐的现代方案,支持 Windows/macOS/Linux/.NET Core/.NET 5+,语音更自然(支持神经语音)、多语言、可细粒度控制音色/语调/停顿。但必须联网,且需要 Azure 订阅密钥和区域配置。

容易踩的坑是复制文档示例时漏掉 await 或忽略 DisposeAsync(),导致音频播放卡住或资源泄漏;另一个高频问题是 SpeechConfig.FromSubscription() 传入错误的 region(比如密钥在 eastus,却填成 chinaeast2),结果报错 Failed with status code Unauthorized。

  • 语音名必须精确匹配 Azure 支持列表,例如中文用 zh-CN-XiaoxiaoNeural,写成 zh-CN-xiaoxiao 会静默回退到基础语音
  • 合成到内存流用 SpeechSynthesizer(speechConfig, null) + SynthesizeTextAsync(),返回 SpeechSynthesisResult,其 AudioData 是 WAV 格式原始字节
  • 若在 ASP.NET Core 中使用,避免在静态单例里复用 SpeechSynthesizer 实例(非线程安全),应按需创建或使用工厂模式
var config = SpeechConfig.FromSubscription("key", "eastus");
config.SpeechSynthesisVoiceName = "zh-CN-YunyangNeural";
using var synthesizer = new SpeechSynthesizer(config);
var result = await synthesizer.SynthesizeTextAsync("今天天气不错");

绕过权限/部署限制:用 Process.Start() 调起系统 TTS 工具

当目标机器无法安装 .NET Framework 或没权限引用 NuGet 包时,可借助 Windows 自带的 PowerShell 或 Windows.Media.SpeechSynthesis(UWP)间接实现。但注意:这不是纯 C# 实现,而是进程级调用,可控性弱、调试难。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载

典型失败场景是 PowerShell 脚本执行被组策略禁用(ExecutionPolicy 为 Restricted),或脚本中用了中文引号、全角空格导致解析失败;还有人误把 Out-Null 写成 Out-Nulll,结果进程卡死无响应。

  • PowerShell 方案本质是调用 Add-Type -AssemblyName System.Speech; $s = New-Object System.Speech.Synthesis.SpeechSynthesizer; $s.Speak('text')
  • 必须用 UseShellExecute = false + CreateNoWindow = true,否则弹黑窗;重定向 StandardError 可捕获执行失败原因
  • 不推荐用于高并发场景(每次启动新进程开销大),仅作临时补救或兼容老旧环境

为什么不用 Windows.Media.SpeechSynthesis(UWP)?

这个 API 在 UWP 应用中可用,但不能直接用于传统 .NET Framework/.NET Core 控制台或 WinForms 项目——引用 Windows.winmd 会触发“类型在多个程序集中定义”冲突,且打包部署复杂(需 AppContainer 权限、Store 签名等)。

即使强行通过 TargetPlatformVersion 和 WindowsSdkPackage 引入,在非 UWP 宿主中调用 SpeechSynthesizer 构造函数也会抛 COMException: Class not registered。简单说:它只属于 UWP 生态,硬塞进其他项目只会增加维护成本。

真正需要跨平台又不想碰云服务的,目前没有完美替代;要么接受 System.Speech 的 Windows 限定,要么用 Azure SDK 承担网络与配置负担。折中点在于:是否允许用户离线使用——如果必须离线,System.Speech 就是事实标准,别花时间折腾其他封装。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2863

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

6243

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7150

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6978

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

1003

5

c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

1132

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

3311

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

925

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

2655

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习