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. webpack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  2. 基于MD5的增强型摘要算法

    message-digest algorithm 5(信息-摘要算法),md5的长度,默认为128bit,也就是128个0和1的二进制串.但是,这样表达是很不友好的,所以将二进制转成了16进制,每4个 ...

  3. docker部署nginx,并实现负载均衡。

    安装与使用 安装 nginx官网下载地址 发布版本分为 Linux 和 windows 版本. 也可以下载源码,编译后运行. 从源代码编译 Nginx 把源码解压缩之后,在终端里运行如下命令: $ . ...

  4. fedora 中从命令行中直接打开资源管理器

    windows 中 使用 start . 可以实现 macos 中 使用 open . 可以实现 linux 中 可以使用 nautilus . 可以实现 了解nautilus 详细的使用说明,可以 ...

  5. 【转】Java学习---Java核心数据结构(List,Map,Set)使用技巧与优化

    [原文]https://www.toutiao.com/i6594587397101453827/ Java核心数据结构(List,Map,Set)使用技巧与优化 JDK提供了一组主要的数据结构实现, ...

  6. 再谈全局网HBase八大应用场景

    摘要: HBase可以说是一个数据库,也可以说是一个存储.拥有双重属性的HBase天生就具备广阔的应用场景.在2.0中,引入了OffHeap降低了延迟,可以满足在线的需求.引入MOB,可以存储10M左 ...

  7. tp查询顺序

    tp竟然可以跟据商品的id来进行排序查询的数据 记一些php中排序: sort()方法一维索引数组进行值升序排序 rsort()方法一维索引数组进行值降序排序 unsort()方法负责编写自定义排序操 ...

  8. October 20th 2017 Week 42nd Friday

    My life is in these books. Read these and know my heart. 我的人生就在这些书中,读完他们就能读懂我的心. Some people say tha ...

  9. 模拟的confirm

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...

  10. 5.Dubbo2.5.3泛化引用和泛化实现

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Ma ...