一、项目中一直用到了文字转语音的功能,需求也比较简单,就是将一段报警信息通过语音的方式播放出来,之前一直采用CS客户端,利用微软自带的Speech语音播放库就可以完成,

1.1 封装winSpedk类代码如下:

namespace Speak
{
using System;
using System.Runtime.CompilerServices;
using System.Speech.Synthesis;
using System.Threading;
using SpeechLib; public class WinSpeak
{
#region 属性
private SpeechSynthesizer Speak;
public event ErrorInfo ErrorInfoEvent;
private Thread thVoice;
private string strVoiceMsg;
SpVoice Voice = null;
private static WinSpeak _intence;
#endregion private WinSpeak()
{
Voice = new SpVoice();
} #region 方法
public static WinSpeak _Init()
{
if (_intence == null)
_intence = new WinSpeak(); return _intence;
}
/// <summary>
/// 读语音
/// </summary>
private void SpeakM()
{
try
{
if (Speak != null)
{
this.Speak.SpeakAsync(strVoiceMsg);
}
}
catch (Exception exception)
{
this.ErrInfo(exception);
}
}
/// <summary>
/// 异步播放文本语音
/// </summary>
/// <param name="msg"></param>
public void BeginSpeakText(string msg)
{
try
{
if (Speak != null)
{
Speak.SpeakAsyncCancelAll();
Speak.Dispose();
} if (thVoice != null && thVoice.ThreadState == ThreadState.Running)
{
thVoice.Abort();
} Speak = new SpeechSynthesizer();
Speak.SetOutputToDefaultAudioDevice(); strVoiceMsg = msg; //thVoice = new Thread(new ThreadStart(SpeakM));
//thVoice.Start();
Speak.SpeakAsync(msg); GC.Collect();
GC.WaitForPendingFinalizers();
}
catch (Exception exception)
{
this.ErrInfo(exception);
}
}
/// <summary>
/// 播放文本语音
/// </summary>
/// <param name="msg"></param>
public void SpeakText(string msg)
{
try
{
this.Speak = new SpeechSynthesizer();
this.Speak.Speak(msg);
this.Speak.SetOutputToNull();
this.Speak.Dispose();
}
catch (Exception exception)
{
this.ErrInfo(exception);
}
}
/// <summary>
/// Speech播放文本合成语音
/// </summary>
/// <param name="msg"></param>
public void Speech_SpeakText(string msg)
{
try
{
if (Voice != null)
{
Voice.Speak(null, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
Voice.Speak(msg, SpeechVoiceSpeakFlags.SVSFlagsAsync);
}
}
catch (Exception ex)
{
this.ErrInfo(ex);
}
}
/// <summary>
/// 关闭语音释放资源
/// </summary>
public void SpeakClose()
{
try
{
if (Speak != null)
{
this.Speak.SpeakAsyncCancelAll();
this.Speak.Dispose();
} if (Voice != null)
{
Voice.Speak(null, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
}
}
catch (Exception ex)
{
cGlobe_Log.Error(cGlobe_Log.GetMethodInfo() + ex.Message);
}
}
/// <summary>
/// 获取错误信息
/// </summary>
/// <param name="str"></param>
private void ErrInfo(Exception str)
{
if (this.ErrorInfoEvent != null)
{
this.ErrorInfoEvent(str);
}
}
#endregion ~WinSpeak()
{
try
{
if (Speak != null)
{
this.Speak.SpeakAsyncCancelAll();
this.Speak.Dispose();
}
}
catch (Exception exception)
{
//this.ErrInfo(exception);
}
}
}
}

1.2  调用如下(一个同步播放、一个异步播放):

   private void btnTest_Click(object sender, EventArgs e)
{
try
{
string strSep = txtWord.Text;
SFBR.WinSpeak._Init().Speech_SpeakText(strSep);
}
catch (Exception ex)
{ }
} private void button1_Click(object sender, EventArgs e)
{
try
{
string strSep = txtWord.Text;
SFBR.WinSpeak._Init().BeginSpeakText(strSep);
}
catch (Exception ex)
{ }
}

二、 最近客户提出需求需要在BS系统实现文字语音播放的功能,因不能接入外网不能调用第三方服务等,最后想到了一个解决方案:先把文字转化为音频文件,再把音频文件以流的形式推送到BS端进行播放;

2.1  同样可以利用微软自带的Speech语音播放库将一段文本转化为音频文件:

2.2 封装 SpeechService文字转换音频文件类

    public class SpeechService
{
private static SpeechSynthesizer synth = null;
/// <summary>
/// 返回一个SpeechSynthesizer对象
/// </summary>
/// <returns></returns>
private static SpeechSynthesizer GetSpeechSynthesizerInstance()
{
if (synth == null)
{
synth = new SpeechSynthesizer();
}
return synth;
}
/// <summary>
/// 保存语音文件
/// </summary>
/// <param name="text"></param>
public static void SaveMp3(string strFileName,string spText)
{
synth = GetSpeechSynthesizerInstance();
synth.Rate = ;
synth.Volume = ;
synth.SetOutputToWaveFile(strFileName);
synth.Speak(spText);
synth.SetOutputToNull();
}
}

2.3  接下来就是将音频文件以文件流的形式推送到前端播放:

  public async Task<ActionResult> PlayWav(string id,string spText)
{
string strPath = Server.MapPath("~\\MP4\\" + id + ".wav");
SpeechService.SaveMp3(strPath, spText);
try
{
using (FileStream fileStream = new FileStream(strPath, FileMode.Open))
{
byte[] fileByte = new byte[fileStream.Length];
fileStream.Seek(, SeekOrigin.Begin);
fileStream.Read(fileByte, , (int)fileStream.Length);
long fSize = fileStream.Length;
long startbyte = ;
long endbyte = fSize - ;
int statusCode = ;
if ((Request.Headers["Range"] != null))
{
//Get the actual byte range from the range header string, and set the starting byte.
string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
startbyte = Convert.ToInt64(range[]);
if (range.Length > && range[] != "") endbyte = Convert.ToInt64(range[]);
//If the start byte is not equal to zero, that means the user is requesting partial content.
if (startbyte != || endbyte != fSize - || range.Length > && range[] == "")
{ statusCode = ; }//Set the status code of the response to 206 (Partial Content) and add a content range header.
}
long desSize = endbyte - startbyte + ;
//Headers
Response.StatusCode = statusCode;
Response.ContentType = "audio/mpeg";
Response.AddHeader("Content-Accept", Response.ContentType);
Response.AddHeader("Content-Length", desSize.ToString());
Response.AddHeader("Content-Range", string.Format("bytes {0}-{1}/{2}", startbyte, endbyte, fSize));
return File(fileByte, Response.ContentType); }
}
catch (Exception ex)
{
throw;
}
}

    注意:返回的必须为异步( async Task)不然会报错,因为文字音频转换涉及到异步调用

2.4 前端展示

2.5  运行截图如下:

BS实现文字音频调用demo地址如下:

  https://github.com/lxshwyan/SpeechBSDemo.git

CS程序和BS程序文字转语音的更多相关文章

  1. 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字“Hello Android”,并将应用程序的名称更改为“FirstApp”。

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字"Hello Android",并将应用程序的名称更改为"Firs ...

  2. 简单C#文字转语音

    跟着微软走妥妥的,C#文字转语音有很多参数我就不说了,毕竟我也是初学者.跟大家分享最简单的方法,要好的效果得自己琢磨喽: 先添加引用System.Speech程序集: using System; us ...

  3. C# ms speech文字转语音例子

    最近突发奇想 想玩玩  文字转语音的东东   谷歌了一下 发现微软有一个TTS 的SDK   查了查相关资料  发现 还真不错  然后就开始玩玩Microsoft Speech SDK的 DEMO了 ...

  4. web端文字转语音的几种方案

    最近在开发一个微信排队取号的的系统,其中对于服务员端(管理端) 需要有呼叫功能,即点按钮 就播出"xxx号顾客请就座"的声音. 经过在网上一番搜索研究,web端实现指定文字的语音播 ...

  5. speech sdk 文字转语音

    1.下载SDK包 https://www.microsoft.com/en-us/download/details.aspx?id=10121 2.直接上代码 // SpeechRecognition ...

  6. springboot文字转语音(jacob)

    近期项目中出现在离线情况下文字转语音的需求 进过尝试返现jacob还不错 一下为开发记录: 1.pom.xml中引入jacob.jar <dependency> <groupId&g ...

  7. Web程序和应用程序服务器[转]

    转自:http://hi.baidu.com/lclkathy/blog/item/dae3be36763a47370b55a970.html 一 常见的WEB服务器和应用服务器 在UNIX和LINU ...

  8. 好程序与差程序Good Programming, Bad Programming

    好程序与差程序 Good Programming, Bad Programming 发布时间: 2012-11-20 16:32:21| 阅读数:2,735 views 优秀的程序可以使复杂的东西看起 ...

  9. 改善C#程序,提高程序运行效率的50种方法

    改善C#程序,提高程序运行效率的50种方法   转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET ...

随机推荐

  1. C# 特性的使用

    using ClassLibrary;using System;using System.Collections.Generic;using System.Linq;using System.Refl ...

  2. WPF DataGrid 的RowDetailsTemplate的使用

    <Window x:Class="DataGridExam.DataGridRowDetailsExam"        xmlns="http://schemas ...

  3. ELINK编程器典型场景之序列号烧写

    序列号烧写功能是指往指定的FLASH存储位置写入产品序列号.由于产品序列号写入到FLASH存储位置,启用序列号功能需要考虑以下几个方面:如果您的应用使能了读保护,则解除读保护将触发全片擦除机制,序列号 ...

  4. dataGrid 源更新 事件

    DataGrid myGrid = new DataGrid(); CollectionView myCollectionView = (CollectionView)CollectionViewSo ...

  5. Android零基础入门第11节:简单几步带你飞,运行Android Studio工程

    原文:Android零基础入门第11节:简单几步带你飞,运行Android Studio工程 之前讲过Eclipse环境下的Android虚拟设备的创建和使用,现在既然升级了Android Studi ...

  6. 基于svg.js实现可编辑的图像

    svg.js的git地址https://github.com/svgdotjs/svg.js 实现可以拖动,可双击编辑,可拖动改变长短,线条可旋转以及一个可点击改变大小,可更改内容的二维码. 首先引入 ...

  7. IdHTTP设置SSL证书,乱码问题也解决了

    要跟银行做接口,需要使用delphi来post数据,但对方提供的是https开头的网址,需要使用证书,对方已提供证书了,但是还是调用不成功,使用的是idhttp和TIdSSLIOHandlerSock ...

  8. JavaScript API for Office Outlook Add-in - “一页纸文档“

    上一篇文章 Office Add-in Model 为 Outlook Mail Add-in 提供的 JavaScript API 介绍 ,简单地在表格中列出了所有的 Object 定义,但是个人感 ...

  9. qt sql事务操作

    事务是数据库的一个重要功能,所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位.在Qt中用transaction()开始一个事务操作,用commit()函数或 ...

  10. 使用BCP批量导入数据

    本文原创,转载请标明出处 BCP 工具的使用 The bulk copy program utility (bcp) bulk copies data between an instance of M ...