1. 利用DONET框架自带的 SpeechSynthesizer ,缺点是没有感情色彩,抑扬顿挫等。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Speech.Synthesis;
using System.Threading;
using Microsoft.Win32; namespace MSSpeech
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
speech = new SpeechSynthesizer();
speech.Rate = rate;
// speech.SelectVoice("Microsoft Lili");//设置播音员(中文)
speech.SelectVoice("Microsoft Anna"); //英文
speech.Volume = value;
speech.SpeakCompleted += speech_SpeakCompleted;//绑定事件
Closing += new System.ComponentModel.CancelEventHandler(MainWindow_Closing); } void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
speech.SpeakAsyncCancelAll();//停止阅读
speech.SpeakCompleted -= speech_SpeakCompleted;
} private SpeechSynthesizer speech;
/// <summary>
/// 音量
/// </summary>
private int value = 100;
/// <summary>
/// 语速
/// </summary>
private int rate;
private string words = ""; private void btnSpeech_Click(object sender, RoutedEventArgs e)
{
test();
} void test()
{ string text = textBox1.Text; if (text.Trim().Length == 0)
{
MessageBox.Show("不能阅读空内容!", "错误提示");
return;
} words = textBox1.Text;
new Thread(Speak).Start(); } private void Speak()
{ speech.SpeakAsync(words);//语音阅读方法 } /// <summary>
/// 语音阅读完成触发此事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void speech_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
{
btnSpeech.Content = "语音试听";
} // <summary>
/// 生成语音文件的方法
/// </summary>
/// <param name="text"></param>
private void SaveFile(string text)
{
speech = new SpeechSynthesizer();
var dialog = new SaveFileDialog();
dialog.Filter = "*.wav|*.wav|*.mp3|*.mp3";
dialog.ShowDialog(); string path = dialog.FileName;
if (path.Trim().Length == 0)
{
return;
}
speech.SetOutputToWaveFile(path);
speech.Volume = value;
speech.Rate = rate;
speech.Speak(text);
speech.SetOutputToNull();
MessageBox.Show("生成成功!在" + path + "路径中!", "提示"); } }
}

  

2. 百度语音合成,在线模式,缺点需要联网发送请求,如果文本太多就会有延迟问题需要解决。

请求API例子:

Request URL:http://ai.baidu.com/aidemo
Request Method:POST
Status Code:200 OK
Remote Address:220.181.164.109:80
Referrer Policy:no-referrer-when-downgrade
Response Headers
view source
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Type:text/json; charset=UTF-8
Date:Wed, 26 Sep 2018 07:41:51 GMT
Server:Apache
Tracecode:25108570390947468554092615
Tracecode:25108562210900343306092615
Transfer-Encoding:chunked
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:751
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:BAIDUID=2BF1001DCF35B79BEFB7C9C63C0C90B7:FG=1; BIDUPSID=2BF1001DCF35B79BEFB7C9C63C0C90B7; PSTM=1517209070; H_PS_PSSID=26523_1431_21080_26350_20928; Hm_lvt_8b973192450250dd85b9011320b455ba=1537947694; Hm_lpvt_8b973192450250dd85b9011320b455ba=1537947694; seccode=45956e63379931ef6aa0f3c472ad195c
Host:ai.baidu.com
Origin:http://ai.baidu.com
Referer:http://ai.baidu.com/tech/speech/tts
User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36
X-Requested-With:XMLHttpRequest
Form Data
view source
view URL encoded
type:tns
spd:5
vol:5
per:4
tex:百度语音,面向广大开发者永久免费开放语音合成技术。所采用的离在线融合技术,根据当前网络状况,自动判断使用本地引擎或云端引擎,进行语音合成,再也不用担心流量消耗了

3. 用 DotNetSpeech.dll 第三方组件,缺点 朗读比较生硬,语音库和本地系统相关。

代码:

SpVoice sp = new SpVoice();
sp.Rate = GetSpeedSelected();
SpeechVoiceSpeakFlags sFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
sp.Speak(text, sFlags);

后记:

下面是测试百度文本转语音的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Windows;
using System.Windows.Threading;
using System.Windows.Controls; namespace TextSpeech
{
public class BaiduSpeech
{ public static string Text2Voice(string sText) { sText = Uri.EscapeDataString(sText );
string post = "type=tns&spd=5&pit=10&vol=5&per=4&tex=%E6%8F%90%E4%BE%9B%E5%A4%9A%E7%A7%8D%E5%8F%91%E9%9F%B3%E4%BA%BA%0A%E6%8F%90%E4%BE%9B%E5%9F%BA%E7%A1%80%E9%9F%B3%E5%BA%93%E5%92%8C%E7%B2%BE%E5%93%81%E9%9F%B3%E5%BA%93%E5%85%B19%E7%A7%8D%E5%8F%91%E9%9F%B3%E4%BA%BA%E4%BE%9B%E6%82%A8%E9%80%89%E6%8B%A9%EF%BC%8C%E9%80%82%E7%94%A8%E4%BA%8E%E6%B3%9B%E9%98%85%E8%AF%BB%E3%80%81%E8%AE%A2%E5%8D%95%E6%92%AD%E6%8A%A5%E3%80%81%E6%99%BA%E8%83%BD%E7%A1%AC%E4%BB%B6%E7%AD%89%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF%EF%BC%8C%E5%8D%B3%E5%B0%86%E6%8E%A8%E5%87%BA%E6%9B%B4%E5%A4%9A%E7%89%B9%E8%89%B2%E5%8F%91%E9%9F%B3%E4%BA%BA";
post = "type=tns&spd=5&pit=10&vol=5&per=4&tex="+sText;
string s= HttpHelper2.httpPost("http://ai.baidu.com/aidemo", post );
// MessageBox.Show(s);
//if get OK result: {"errno":0,"msg":"success","data":"data:audio\/x-mpeg;base64,\/\/MoxAA............VVVV"}
//convert from audio base64 string to byte
if (s.Contains("data:audio\\/x-mpeg;base64"))//success get audio
{
s = System.Text.RegularExpressions.Regex.Unescape(s);
string stringInBase64 = s.Replace("{\"errno\":0,\"msg\":\"success\",\"data\":\"data:audio/x-mpeg;base64,","").Replace("\"}","");
byte[] bytes = System.Convert.FromBase64String(stringInBase64);
WriteByteToFile(bytes, "temp.mp3"); //保存本地文件后可用 MediaElement 组件来播放。
// playAudio(bytes);//播放声音,如果不是WAV格式的流会失败。
// PlaySound(md,AppDomain.CurrentDomain.BaseDirectory + "\\temp.mp3"); } return s;
} /// <summary>
/// 写byte[]到fileName
/// </summary>
/// <param name="pReadByte">byte[]</param>
/// <param name="fileName">保存至硬盘路径</param>
/// <returns></returns>
static bool WriteByteToFile(byte[] pReadByte, string fileName)
{
FileStream pFileStream = null;
try
{
pFileStream = new FileStream(fileName, FileMode.OpenOrCreate);
pFileStream.Write(pReadByte, 0, pReadByte.Length);
}
catch
{
return false;
}
finally
{
if (pFileStream != null)
pFileStream.Close();
}
return true;
} static void playAudio(byte[] data)
{
MemoryStream ms = new MemoryStream(data);
ms.Position = 0;
System.Media.SoundPlayer player = new System.Media.SoundPlayer();
player.Stream = ms;
player.LoadAsync();
player.Play();//The wave header is corrupt. 说明这个不是WAV格式文件流 } static void PlaySound(MediaElement md ,string url)
{
md.LoadedBehavior = MediaState.Manual;
md.IsEnabled = true;
md.Stop();
md.Source = null;
md.Source = new Uri(url);
md.Play(); } } public class HttpHelper2 { CookieContainer myCookieContainer = new CookieContainer();
public static string httpPost(string url, string post)
{
string s = "";
try
{
byte[] data = Encoding.ASCII.GetBytes(post);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "POST";
req.Headers.Add("Cookie", "BAIDUID=CA97D41AACE2AD8A2750225E9F53C9BA:FG=1; BIDUPSID=CA97D41AACE2AD8A2750225E9F53C9BA; PSTM=1562830960; BDUSS=1Vib0ZXRjlqYnBmNG1SaW4wZjJ0SE0wRW40MXhJdE1JT01RQmk5QmtoMzB2VmRkSVFBQUFBJCQAAAAAAAAAAAEAAADSJwUAd2dzY2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQwMF30MDBdN; H_WISE_SIDS=126894_127760_132206_132550_133721_120202_133016_132911_133041_131246_132439_130762_132378_131518_118889_118863_118845_118826_118787_107320_133159_132780_134393_133352_129647_134434_124636_128968_132540_133837_133473_131906_133838_133847_132552_134460_133424_134319_134214_129645_131423_134345_133587_110085_134152_127969_131299_127318_127417_134150_133668_134352; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; H_PS_PSSID=29716_1446_21115_29523_29520_29721_29568_29220; PSINO=6; Hm_lvt_8b973192450250dd85b9011320b455ba=1567135060; Hm_lpvt_8b973192450250dd85b9011320b455ba=1567135060");
req.ContentType = "application/x-www-form-urlencoded";
req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36";
req.Referer = "http://ai.baidu.com/tech/speech/tts?track=cp:ainsem|pf:pc|pp:chanpin-yuyin|pu:yuyin-yuyinhecheng-pinpai|ci:|kw:10003541";
req.ContentLength = data.Length;
req.GetRequestStream().Write(data, 0, data.Length);
// req.CookieContainer = myCookieContainer;
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
// myCookieContainer.Add(resp.Cookies);
StreamReader r = new StreamReader(resp.GetResponseStream());
s = r.ReadToEnd();
r.Close();
resp.Close();
req.Abort(); }
catch (Exception ex)
{ s = ex.Message; } return s;
} } }

  

C# 文本转语音朗读的更多相关文章

  1. C#语音朗读文本 — TTS的实现

    TTS, Text To Speech的缩写,是使用语音朗读文本的技术.目前,在国内应用较多的是排队叫号系统 Windows 平台的TTS,通常使用的是微软自带的 Speech API. Window ...

  2. 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

    作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...

  3. 使用JAVA实现语音朗读一段文本

    需要做的工作: 1.下载  jacob-1.17-M2 或 jacob-1.18 2.解压jacob-1.17-M2 或 jacob-1.18 3.向工程里导入jacob.jar 4.将 jacob- ...

  4. 主攻ASP.NET.4.5.1 MVC5.0之重生:Web项目语音朗读网页文本,简单语音提示浏览状态

    第一步 添加SpeechLib.dll 下载SpeechLib.dll: 在项目中并且引用DLL using SpeechLib; using System.Threading; 第二步 调用并使用 ...

  5. 用TTS实现文本转语音

    最近被toefl单词虐成狗::>_<:: 想做一个可以自动把单词转成语音的软件,这样就可以在路上戴耳机边走边听啦~ 用微软的TTS语音库可以很容易地实现.早期的TTS要想实现中英文混合朗读 ...

  6. iOS 文本转语音(TTS)详解:Swift

    上一篇博客讲解了iOS的speech FrameWork语音识别的功能:http://www.cnblogs.com/qian-gu-ling/p/6599670.html,对应的这篇博客就写一下文本 ...

  7. Python 文本转语音

    文本转语音,一般会用在无障碍开发.下面介绍如何使用Python实现将文本文件转换成语音输出. 准备 使用Speech API 原理 示例代码 小总结 pyttsx方式 原理 示例代码 小总结 pytt ...

  8. py库:文本转为语音(pywin32、pyttsx)

    http://blog.csdn.net/marksinoberg/article/details/52137547 Python 文本转语音 文本转为语音(使用Speech API) 需要安装 py ...

  9. AWS机器学习初探(2):文本翻译Translate、文本转语音Polly、语音转文本Transcribe

    AWS机器学习初探(1):Comprehend - 自然语言处理服务 这几个服务的功能和使用都很直接和简单,因此放在一篇文章中介绍. 1. 文本翻译服务 Translate 1.1 功能介绍 AWS ...

随机推荐

  1. DouPHP去除Powered by DouPHP版权的方法

    DouPHP标题版权修改:打开 include 目录下的 action.class.php 文件,搜索“Powered”找到下面一行代码: $page_title = ($titles ? $titl ...

  2. 更多内容 - 请关注我的 CSDN 博客

    欢迎关注我的 CSDN 博客 因为粉丝多数是在 CSDN 上,所以更多内容放在了 我的 CSDN 博客: [点击跳转] 地址:https://icode.blog.csdn.net

  3. the database needs something to populate existing rows.

    这是我在使用Django进行models编写时的一个错误. 解决办法: 为其指定一个默认值即可 object_id = models.CharField(max_length=50, default= ...

  4. VMWare虚拟机安装Linux系统时安装界面显示不全的解决、Linux分区

    1.只有最下面的按钮不全(可以显示字的一部分):可以用Tab键操控进行下一步 2.只有一半左右的界面:用Alt+鼠标左键移动安装界面 3.关于Linux分区:如果想用Linux进行深入操作,尽量不要选 ...

  5. 在web中如何调整上传过的图片方向 (exif)

    前提: 相机中拍的照片放到web上不会自动识别方向,如有些竖向显示的照片放到web上横向显示.这些照片在windows上是正确显示的.但是web不会自动旋转照片到正确方向.下面我们通过两种方法来实现这 ...

  6. fedora27安装后的配置工作(持续更新)

    换源 没什么可说的,安装后更换国内软件源是必须做的事,推荐更换阿里的镜像源.换源教程 添加epel源 EPEL (Extra Packages for Enterprise Linux)是基于Fedo ...

  7. SQL server权限管理和备份实例

    权限设置: 1.创建用户zhangsan,并赋予zhangsan有dbcreator的服务器权限. 2.使用zhangsan登录,测试能否创建数据库. 3.使用sa用户附加myschool数据库,设置 ...

  8. Java多线程学习笔记之三内存屏障与Java内存模型

    基本内存屏障 处理器支持那种内存重排序,就会提供能够禁止相应内存重排序的的指令,这些指令就被成为基本内存屏障:StroeLoad屏障.StroeLoad屏障.LoadLoad屏障.LoadStore屏 ...

  9. eclipse 汉化详细方法

    1.首先确认自己的 eclipse 是哪个版本,这个很关键,涉及到后面要用到的语言包需要与版本匹配,启动 eclipse,观察对应的版本号,比如我用的是 Photon 版本 2.参照官方给的方法进行下 ...

  10. [TJOI2013]拯救小矮人

    题目 首先有一个很假的贪心 我们定义一个人的需求为\(H-h_i-b_i\),就是这个人需要多少的高度在他下面他才能逃出去 我们趁剩余的高度还够,优先满足需求较高的 显然是错的,可能有一个人身高很高, ...