VC编程实现文本语音转换
C#实现文本转语音功能
C#实现⽂本转语⾳功能由于最近的⼯作需要⽤到⽂本转语⾳的功能,在⽹上找到的资料有些不完整,特此记录下整个完整功能。
这种⽅式的优点在于不会被浏览器限制,在js的⽂本转语⾳功能中,⾕歌⾼版本的浏览器会阻⽌通过模拟点击的⾃动播放,⽽ie不会阻⽌.⼀.确认研发环境操作系统:win10或win7(我⾃⼰⽤的是win10 据说有些阉割版的win7会报错)IDE:VS2012 (可⾼于此版本).NET framework 4.0(可⾼于此版本)⼆.系统⾃带语⾳识别功能1.C:\Windows⽂件夹下有Speech2.控制⾯板有语⾳识别三.DLL引⽤1.选中要使⽤该功能的程序右键选择"添加引⽤"2.选中"程序集"--"框架"下的System.Speech四.代码需要注意的是:1.页⾯需要设置为异步2.通过委托代理的⽅式调⽤,防⽌页⾯⽆响应3.页⾯代码如下:aspx:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="yy.aspx.cs" Inherits="yy" Async="true" %><!DOCTYPE html><html xmlns="/1999/xhtml"><head id="Head1" runat="server"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>⽂字转语⾳测试</title></head><body><form id="form1" runat="server"><div><asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /></div></form></body></html>aspx.cs:using System;using System.Collections.Generic;using System.Globalization;using System.Linq;using System.Speech.Synthesis;using System.Threading.Tasks;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;public partial class yy : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){}/// <summary>/// ⽂字转语⾳/// </summary>/// <param name="content">语⾳内容</param>delegate void MyDelegate(string content);string content = "有新的订单,请及时处理";SpeechSynthesizer synthesizer = new SpeechSynthesizer(); //点击开始按钮//开始朗读private void speakParagh(string text){synthesizer.Speak(text);}//朗读结束后释放资源private void Completed(IAsyncResult result){synthesizer.SpeakAsyncCancelAll();}protected void Button1_Click(object sender, EventArgs e){try{MyDelegate myDelegate = new MyDelegate(speakParagh); //异步调⽤委托myDelegate.BeginInvoke(content, new AsyncCallback(Completed), null); //在启动异步线程后,主线程可以继续⼯作⽽不需要等待 }catch (Exception ex){Console.WriteLine("报错:" + ex.Message);}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
用C_实现文本朗读和语音识别功能
{ private SpeechRecognizer SRE; public event EventHandler<RecognizeEventArgs>
RecognitionEvent;// 声 明 事 件 成 员 // <summary> // 识别 // </summary> // <param name="text">识别的文字</param> // <param name="action">识别成功后的行为</
和 Recognition。 其中 Synthesizer 命名空间提供的 SpeechSynthesizer 类 , 可 以 轻 松 实 现 文 本 朗 读 功 能 ; Recognition 空 间 提 供 了语言识别类 SpeechRecognizer。 2.3 添加引用
要使用 SpeechSynthesizerhe、 SpeechRecognizer 这两个类 需 添加引用。 新建一个 Windows 窗体应用程序, 点击 “项目” 菜 单 下 的 “添 加 引 用 ” 子 菜 单 , 在 “.Net 选 项 ” 中 选 择 System. Speech 组件名称, 点击确定按钮, 如图 1 所示。
SpeechRecognizedEventArgs>(g_SpeechRecognized); //注 册 识 别 事 件
SRE.LoadGrammar(g);// 将 语 法 装 入 识 别 器 中 。 //SRE 是 SpeechRecognizerde 的实例
} // <summary>
// 函数作用:识别到文字后,通知 frmmain 窗体上的 //axAgent1 控件对象,执行动作
在Visual C++6.0中使用Text-to-Speech
在Vis ua l C++6.0中使用T ext-to-S pee c h作者:fly bug_zgj下载源代码一、前言网上很多程序都可以阅读英文和中文,典型的就是金山词霸,最近找了一下,发现网上在VC这方面的资料不是很多,好些程序都是基于A PI的(比如VC KBA SE ::首页>>文档中心>>在线杂志>>音频技术中的文章"文本语音转换入门"作者:S uy u),加之我在V C KBA SE 获益良多,现在想回报一二,所以就写了个基于MFC的程序,希望抛砖引玉,请高手指点。
二、安装TT S引擎要使用TTS必须安装微软的TTS引擎,这点S uy u已经说明了,作为用户需要下载两个文件MSTTS.E XE和SPC HA PI.E XE,如果需要阅读中文,还需要下载中文发音包S im pC hine se Spee ch Pa cka ge。
这三个软件都可以在微软主页上找到,如果您发布程序,则需要将其打包在一起。
作为程序员,您可以去微软主页下载M icroso f t S pee ch SDK, v e rsio n 5.1,顺便把中文和日文的语言包S pee chSDK51LangP a ck.e xe下载回来。
三、建立程序项目∙ 1.建立一个MFC A ppWiza rd(e xe)∙ 2.在ste p1里面选择D ia lo g Ba se d∙ 3.在ste p2里面把A uto ma tion选项勾上(必需这么做)∙ 4.结束四、导入类型库查找spa i.dll,将其拷贝到你程序的re s 目录(不拷贝也行^_^),打开M F C C la ssWiza rd,选择A utom a tio n 页,单击按钮"A dd C la ss…",选择"F ro m a ty pe libra ry…",选中"sa pi.dll"文件,这时系统会出现co nf irm C la sse s 对话框,询问将要导入的类,呵呵,反正闲着也是闲着,全选中吧。
C与智能语音交互掌握人机对话的技巧
C与智能语音交互掌握人机对话的技巧随着人工智能技术的不断发展,智能语音交互系统成为人们日常生活中不可或缺的一部分。
C语言作为一种广泛应用于软件开发领域的计算机编程语言,与智能语音交互具有天然的契合之处。
下面将介绍在使用C语言进行智能语音交互时,掌握人机对话的技巧。
一、语音输入与文本转换在使用C语言进行智能语音交互时,首先需要将语音输入转换为文本形式进行后续处理。
这一过程需要用到语音识别技术。
常用的语音识别API如Google Speech-to-Text、百度语音识别等,可以将语音输入转换为文本。
二、理解用户意图在进行语音交互时,应设定明确的目标,了解用户的意图是至关重要的。
对于C语言来说,可以通过自然语言处理技术来实现用户意图的理解。
常见的自然语言处理API如百度自然语言处理、Google Dialogflow等,可以帮助我们解析用户的语句,提取关键信息,从而准确理解用户的意图。
三、生成合适回应当理解用户的意图之后,需要根据用户的需求生成合适的回应。
在C语言中,可以通过字符串处理函数来拼接文本,生成回应消息。
此外,还可以通过读取外部文本文件或数据库中存储的预设回答,根据用户的意图和问题类型来选择合适的回答。
四、交互流程设计为了提升用户的交互体验,设计合理的交互流程非常重要。
在C语言中,我们可以使用条件语句、循环语句等来控制程序的流程。
例如,可以设计一个循环,持续接收用户输入并生成回应,直到用户明确表示结束对话。
五、错误处理与鲁棒性设计在进行智能语音交互时,不可避免地会遇到一些用户意图无法识别或者系统出错的情况。
因此,对于这些异常情况的处理非常重要。
在C语言中,我们可以使用异常处理机制,如try-catch语句,来捕捉并处理异常。
此外,还可以设置默认回答或提示用户重新输入,以增强程序的鲁棒性。
六、效率优化针对智能语音交互系统,效率也是需要考虑的因素之一。
在C语言中,可以通过优化算法、提升代码运行效率等方式来优化系统性能。
VC编程实现文本语音转换
VC编程实现文本语音转换文本语音(Te某t-to-Speech,以下简称TTS),它的作用就是把通过TTS引擎把文本转化为语音输出。
本文不是讲述如何建立自己的TTS引擎,而是简单介绍如何运用MicrooftSpeechSDK建立自己的文本语音转换应用程序。
MicrooftSpeechSDK简介MicrooftSpeechSDK是微软提供的软件开发包,提供的SpeechAPI (SAPI)主要包含两大方面:1.APIforTe某t-to-Speech2.APIforSpeechRecognition其中APIforTe某t-to-Speech,就是微软TTS引擎的接口,通过它我们可以很容易地建立功能强大的文本语音程序,金山词霸的单词朗读功能就用到了这写API,而目前几乎所有的文本朗读工具都是用这个SDK开发的。
至于APIforSpeechRecognition就是与TTS相对应的语音识别,语音技术是一种令人振奋的技术,但由于目前语音识别技术准确度和识别速度不太理想,还未达到广泛应用的要求。
为了在VC中使用这SDK,必需在工程中添加SDK的include和lib 目录,为免每个工程都添加目录,最好的办法是在VC的Option->Directori立加上SDK的include和lib目录。
一个最简单的例子先看一个入门的例子:#include<api.h>intmain(intargc,char某argv[]){ISpVoice某pVoice=NULL;//COM初始化:if(FAILED(::CoInitialize(NULL)))returnFALSE;//获取ISpVoice接口:HRESULThr=CoCreateIntance(CLSID_SpVoice,NULL,CLSCT某_ALL,IID_ISpVoice,(void某某)&pVoice);if(SUCCEEDED(hr)) {hr=pVoice->Speak(L"Helloworld",0,NULL);pVoice->Releae();pVoice=NULL;}//千万不要忘记:::CoUninitialize();returnTRUE;}短短20几行代码就实现了文本语音转换,够神奇吧。
基于VisualC 2010开发基于Windows7的语音识别与语音合成-程序员投稿课案
基于Visual C++2010开发基于Windows7的语音识别与语音合成-----语音技术业内资深专家尹成力作Windows7相比Vista已经进一步改善了语音技术的体验,改进了语音识别的识别率与语音合成的朗读声音效果。
语音技术与多点触摸是Windows7最耀眼的技术靓点之一。
语音合成和语音识别技术是实现人机语音通信,建立一个有听和讲能力的口语系统所必需的两项关键技术。
使电脑具有类似于人一样的说话能力,是当今时代信息产业的重要竞争市场。
语音合成,又称文语转换(Text to Speech)技术,能将任意文字信息实时转化为标准流畅的自然语音并朗读出来。
它涉及声学、语言学、数字信号处理、计算机科学等多个学科,是中文信息处理领域的一项前沿技术,解决的主要问题就是如何将文字信息转化为可听的声音信息,即让机器像人一样开口说话。
语音识别,就是让机器通过分析和理解过程把语音信号转变为相应的文本或命令的尖端技术。
语音识别是一门交叉学科,所涉及的领域包括:信号处理、模式识别、概率论和信息论、发声机理和听觉机理、人工智能等等。
语音识别技术与语音合成技术一同成为实现人机语音通信,建立有听和讲能力的语音系统所必需的两项关键技术。
让我们来体验下用Visual C++2010开发Windows7的语音识别与语音合成的快感,欣赏微软最新的Windows7新技术给人们带来的便利。
自己实现语音交互技术,让自己开发的软件(准备运行在Windows7上的)可以与用户进行语音交互。
Windows7的语音识别与语音合成与Vista与XP的有所不同,Windows7下开发的应用于Vista与XP可能会遇到API兼容问题。
因为Windows7都已经附带了.Net平台,本文讲述用Visual C++2010开发基于CLR的语音技术应用程序,并同时提供了基于MFC程序兼容调用CLR的办法,无论Visual C++基于CLR或者MFC的程序,如果想升级到Windows7,都可以很快为自己添加语音识别功能,语音朗读功能。
VC实现TTS文字语音朗读MicrosoftSpeechSDK
VC实现TTS文字语音朗读MicrosoftSpeechSDK一. TTS概述随着语音技术的发展,微软也推出了相应的语音开发工具,即Microsoft Speech SDK,这个SDK中包含了语音应用设计接口(SAPI)、微软的连续语音识别引擎(MCSR)以及微软的语音合成(TTS)引擎等等。
它其中的 TTS(text-to-speech)引擎可以用于实现语音合成,我们通过TTS引擎可以分析文本内容并且将其朗读出。
实现TTS技术的方法有很多种,现在主要采用三种:连词技术、语音合成技术、子字连接技术。
目前的5.1版本的SDK一共可以支持3种语言的识别 (英语,汉语和日语)以及2种语言的合成(英语和汉语)。
其中还包括对于低层控制和高度适应性的直接语音管理、训练向导、事件、语法编译、资源、语音识别(SR)管理以及TTS管理等强大的设计接口。
二. 实现原理以下是SpeechAPI的总体结构:从图中我们可以看出语音引擎则通过DDI层(设备驱动接口)和SAPI(SpeechAPI)进行交互,应用程序通过API层和SAPI通信。
通过使用这些API,用户可以快速开发在语音识别或语音合成方面应用程序。
应用程序使用ISpVoice接口来控制TTS,通过调用其中的Speak 方法可以朗读出文本内容,通过调用SetVoice / GetVoice方法(在.NET中已经转变成Voice属性)来获取或设置朗读的语音,而通过调用GetVolume / SetVolume、GetRate / SetRate等方法(在.NET中已经转变成Volume和Rate属性)来获取或设置朗读的音量和语速。
功能强大之处在于TTS能识别XML标记,通过给文本加上XML 标记,我们让TTS朗读出更加符合语言阅读习惯的句子。
例如:l 用于设置文本朗读的音量;l 、分别用于设置文本朗读的绝对速度和相对速度;l 、分别用于设置文本朗读的绝对语调和相对语调;l 在他们之间的句子被视为强调;l 可以将单词逐个字母的拼写出来;l 表示停止发声,并保持500微秒;l 02/03/07 可以按要求朗读出日期l 用于设置朗读所用的语言,其中409表示使用英语,804表示使用汉语,而411表示日语。
C语言自然语言处理文本分析和语音识别
C语言自然语言处理文本分析和语音识别自然语言处理(Natural Language Processing, NLP)是计算机科学与人工智能领域中重要的研究方向之一。
它涉及计算机理解和生成人类自然语言的能力。
在NLP领域中,有两个关键的技术应用:文本分析和语音识别。
本文将介绍如何使用C语言实现自然语言处理中的文本分析和语音识别。
一、文本分析文本分析是指对文本数据进行处理和分析,从中获取有用的信息和知识。
C语言提供了一些功能强大的库和工具,可以用于实现文本分析任务。
下面我们将介绍一些常见的文本分析技术和C语言实现方式。
1. 词频统计词频统计是文本分析中最基础的任务之一。
它可以帮助我们了解文本中的关键词汇以及它们在文本中出现的频率。
在C语言中,我们可以使用哈希表或者数组等数据结构来统计文本中每个单词的出现次数,并按照频率进行排序和展示。
2. 关键词提取关键词提取是指从文本中提取出最具代表性和有意义的关键词汇。
在C语言中,我们可以使用TF-IDF(词频-逆文档频率)算法来进行关键词提取。
TF-IDF是一种用于评估一个词语在文档中的重要程度的统计方法,它可以通过计算一个词语在文档中的词频和在整个文集中的逆文档频率来得出。
3. 文本分类文本分类是将文本分为不同的类别或标签的任务。
在C语言中,我们可以使用机器学习算法(如朴素贝叶斯、支持向量机等)来实现文本分类。
这些算法可以从已标注好的训练文本中学习模型,然后用于对新的未知文本进行分类。
二、语音识别语音识别是将人类语音转换为电脑可理解的文本或指令的过程。
C语言可以通过调用适当的库或API实现语音识别功能。
下面是一些常见的语音识别技术和C语言实现方式。
1. 声学模型声学模型是语音识别的核心组成部分,它可以将语音信号转换为特征向量。
在C语言中,我们可以使用Mel频率倒谱系数(MFCC)来提取语音信号的特征。
MFCC是一种常用的将语音信号转换为特征向量的方法,它可以有效地表征语音信号的频谱特性。
文本转化为语音的VC++编程方法
文本转化为语音的VC++编程方法
吕夏
【期刊名称】《计算机应用》
【年(卷),期】2001(021)007
【摘要】探讨了使用VC++语言,应用COM服务器将语言文本转化为声音的方法及过程.
【总页数】2页(P87-88)
【作者】吕夏
【作者单位】南京理工大学机械学院,
【正文语种】中文
【中图分类】TP311.52
【相关文献】
1.VC++与Matlab混合编程方法∗ [J], 张沛露;王建军
2.VC++与Matlab混合编程方法研究 [J], 穆以东;赵岭
3.测试技术中MATLAB与VC++接口编程方法 [J], 邱荣华
4.VC++实时获取鼠标指针坐标编程方法 [J], 薛永祥
5.VC++与MATLAB混合编程方法 [J], 任源博;张跃宝;
因版权原因,仅展示原文概要,查看原文内容请购买。
C#文字转语音
C#⽂字转语⾳ 之前的项⽬中要⽤到把⽤户输⼊的⽂字转换为语⾳⽂件再播放出来,当时也是⼀头雾⽔没搞明⽩怎么弄,查了好多资料有的是使⽤在线合成语⾳⽂件,这个就有局限性了,不能离线合成,所以就放弃了。
后来发现讯飞是有离线语⾳合成包了,但是官⽹没有C#调⽤的离线包,windows平台只有C++写的包,这个就⽐较坑了。
后来就想到⽤C#调⽤C++dll的⽅式看能不能实现,参考了讯飞官⽹和论坛中⼤神们写的代码,最终还是实现了C#⽂字转换语⾳的功能。
现在把代码贴出来,⼩伙们们可以直接使⽤,不过是要去讯飞官⽹购买离线包的。
public class iFlyTTS{/// <summary>/// 引⼊TTSDll函数的类/// </summary>private class TTSDll{#region TTS dll import[DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]public static extern int MSPLogin(string one, string two, string configs);[DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]public static extern void MSPLogout();[DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]public static extern IntPtr QTTSSessionBegin(string _params, ref int errorCode);[DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]public static extern int QTTSTextPut(string sessionID, string textString, uint textLen, string _params);[DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]public static extern IntPtr QTTSAudioGet(string sessionID, ref int audioLen, ref SynthStatus synthStatus, ref int errorCode);[DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]public static extern IntPtr QTTSAudioInfo(string sessionID);[DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]public static extern int QTTSSessionEnd(string sessionID, string hints);[DllImport("msc.dll", CallingConvention = CallingConvention.Cdecl)]public static extern int QTTSGetParam(string sessionID, string paramName, string paramValue, ref uint valueLen);#endregion}private string sessionID;public iFlyTTS(string configs){int ret = TTSDll.MSPLogin(null, null, configs);if (ret != 0) throw new Exception("初始化TTS引擎错误,错误代码:" + ret);}public void MultiSpeek(string SpeekText, string outWaveFlie = null){MemoryStream mStream = new MemoryStream();try{speek(SpeekText, ref mStream);WAVE_Header header = getWave_Header((int)mStream.Length - 44); //创建wav⽂件头byte[] headerByte = StructToBytes(header); //把⽂件头结构转化为字节数组 //写⼊⽂件头mStream.Position = 0; //定位到⽂件头mStream.Write(headerByte, 0, headerByte.Length); //写⼊⽂件头if (outWaveFlie != null){FileStream ofs = new FileStream(outWaveFlie, FileMode.Create);mStream.WriteTo(ofs);ofs.Close();ofs = null;}}catch (Exception ex){}finally{TTSDll.MSPLogout();mStream.Close();mStream = null;}}/// <summary>/// 把⽂本转换成声⾳,写⼊指定的内存流/// </summary>/// <param name="SpeekText">要转化成语⾳的⽂字</param>/// <param name="mStream">合成结果输出的⾳频流</param>private void speek(string SpeekText, ref MemoryStream mStream){string szParams = "engine_type = local, voice_name = xiaoyan, text_encoding = GB2312, tts_res_path = fo|res\\tts\\xiaoyan.jet;fo|res\\tts\\common.jet, sample_rate = 8000,aue=speex-wb;7, speed = 50, volume = 50, pitch = 50, rdn = 2 int ret = 0;try{sessionID = Ptr2Str(TTSDll.QTTSSessionBegin(szParams, ref ret));if (ret != 0) throw new Exception("初始化TTS引会话错误,错误代码:" + ret);ret = TTSDll.QTTSTextPut(sessionID, SpeekText, (uint)Encoding.Default.GetByteCount(SpeekText), string.Empty);if (ret != 0) throw new Exception("向服务器发送数据,错误代码:" + ret);int audio_len = 0;SynthStatus synth_status = SynthStatus.TTS_FLAG_STILL_HAVE_DATA;MemoryStream fs = mStream;IntPtr audio_data;// Marshal.AllocHGlobal(1024);Thread.Sleep(1000);while (synth_status != SynthStatus.TTS_FLAG_DATA_END){audio_data = TTSDll.QTTSAudioGet(sessionID, ref audio_len, ref synth_status, ref ret); // sdh 这个是会花费时间的byte[] tmpArray = Encoding.Default.GetBytes(SpeekText);if (ret != 0) break;byte[] data = new byte[audio_len];if (audio_len > 0) Marshal.Copy(audio_data, data, 0, audio_len);fs.Write(data, 0, data.Length);}}catch (Exception ex){}finally{ret = TTSDll.QTTSSessionEnd(sessionID, "");if (ret != 0) throw new Exception("结束TTS会话错误,错误代码:" + ret);}}private struct WAVE_Header{public int RIFF_ID; //4 byte , 'RIFF'public int File_Size; //4 byte , ⽂件长度public int RIFF_Type; //4 byte , 'WAVE'public int FMT_ID; //4 byte , 'fmt'public int FMT_Size; //4 byte , 数值为16或18,18则最后⼜附加信息public short FMT_Tag; //2 byte , 编码⽅式,⼀般为0x0001public ushort FMT_Channel; //2 byte , 声道数⽬,1--单声道;2--双声道public int FMT_SamplesPerSec;//4 byte , 采样频率public int AvgBytesPerSec; //4 byte , 每秒所需字节数,记录每秒的数据量public ushort BlockAlign; //2 byte , 数据块对齐单位(每个采样需要的字节数)public ushort BitsPerSample; //2 byte , 每个采样需要的bit数public int DATA_ID; //4 byte , 'data'public int DATA_Size; //4 byte ,}/// <summary>/// 根据数据段的长度,⽣产⽂件头/// </summary>/// <param name="data_len">⾳频数据长度</param>/// <returns>返回wav⽂件头结构体</returns>WAVE_Header getWave_Header(int data_len){WAVE_Header wav_Header = new WAVE_Header();wav_Header.RIFF_ID = 0x46464952; //字符RIFFwav_Header.File_Size = data_len + 36;wav_Header.RIFF_Type = 0x45564157; //字符WAVEwav_Header.FMT_ID = 0x20746D66; //字符fmtwav_Header.FMT_Size = 16;wav_Header.FMT_Tag = 0x0001;wav_Header.FMT_Channel = 1; //单声道wav_Header.FMT_SamplesPerSec = 8000; //采样频率wav_Header.AvgBytesPerSec = 16000; //每秒所需字节数wav_Header.BlockAlign = 2; //每个采样1个字节wav_Header.BitsPerSample = 16; //每个采样8bitwav_Header.DATA_ID = 0x61746164; //字符datawav_Header.DATA_Size = data_len;return wav_Header;}/// <summary>/// 把结构体转化为字节序列/// </summary>/// <param name="structure">被转化的结构体</param>/// <returns>返回字节序列</returns>Byte[] StructToBytes(Object structure){Int32 size = Marshal.SizeOf(structure);IntPtr buffer = Marshal.AllocHGlobal(size);try{Marshal.StructureToPtr(structure, buffer, false);Byte[] bytes = new Byte[size];Marshal.Copy(buffer, bytes, 0, size);return bytes;}finally{Marshal.FreeHGlobal(buffer);}}/// <summary>/// 指针转字符串/// </summary>/// <param name="p">指向⾮托管代码字符串的指针</param>/// <returns>返回指针指向的字符串</returns>public static string Ptr2Str(IntPtr p){List<byte> lb = new List<byte>();while (Marshal.ReadByte(p) != 0){lb.Add(Marshal.ReadByte(p));p = p + 1;}byte[] bs = lb.ToArray();return Encoding.Default.GetString(lb.ToArray());}} 使⽤的时候直接调⽤下⾯的⽅法就⾏,如果要改变⾳⾊或者播放速度的都可以配置的,这个⼩伙伴们⾃⼰研究下,我调试了好⼏种感觉就现在的挺好。
C#文字转语音播放SpVoice
C#⽂字转语⾳播放SpVoice最近拿到⼀个需求,需要调整⼀下现有的语⾳播放逻辑,因为有的语⾳需要循环播放,有的不需要我们以前的逻辑是都不循环的,所以采⽤了SpVoice (引⼊SpeechLib.dll)的异步播放,我拿到了之后发现异步和同步其实应该是都可以实现的,但是异步我认为有⼀个问题就是不知道什么时候能让循环停⽌,搜了很多也没有解决我的问题,于是我尝试了⽤同步来解决这个问题以下是我改进的代码:/// <summary>/// 同步播放语⾳/// </summary>/// <param name="voiceContent">语⾳内容</param>/// <param name="isLoop">是否循环播放</param>/// <param name="isSelectOver">查询是否结束</param>public void playSoundAsync(string voiceContent, bool isLoop, bool isSelectOver = false){VoiceContent = voiceContent;int i = 1;//是否循环播放if (isLoop){//最多循环10次while (i <= 10){//如果查询结束if (isSelectOver){//关闭当前语⾳voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);break;}else{//播放语⾳voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);i++;}}}else{//如果查询结束if (isSelectOver){//关闭语⾳voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);}else{//播放语⾳voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);}}}此时还有⼀个问题,循环的时候第⼆个参数传true ,但是后续还有要播放的内容时,需要先停⽌上⼀个循环,也就是第三个参数需要传true(默认false)⽽后还要再调⽤以下⽅法来播放新的语⾳,我认为这⾥其实可能会有更好的办法,⽬前我还没有想到,如果有哪位⼤神有好的意见,欢迎⼀起头脑风暴。
用VC#编程实现语音合成
库, 它封装了所有管理和控制语音合成引擎运行时操作的底层细
节, 并提供访问语音合成引擎的应用程序接 口, 使得编程访问语 音合成引擎极为简单方便 。语音对象库主要 由应用程序接 口 (P) A I、语音应用程序接口运行时 (peh A I ut e S ec P ni )和 R m 设备驱动程序接 口 ( D ) D I 三部分组成 ( 见图 1。 ) 应用程序、 语音合成引擎和语音对象库之间的关系如图1 所 示。 语音合成引擎通过设备驱动程序接口和语音应用程序接口运 行时进行通信, 而应用程序通过应用程序接口访阿晤音应用程序 接口运行时以达到访问语音合成引擎的目的。 显然。 语音应用程
Z HE NG i gh a Jn- u ‘ ( layOprt ga dSmua n L b A r oc R dr a e , h n4 0 1 , ia Mitr eai n i lt g a , iF re a a Acd my Wu a 3 0 0 Ch ) i n i n
Ab t a tSp e h s n h sstc nq e i d l p le e h i u h ti e o ta so m e td t n o s e c i n 1 s r c : e c y t e i e h iu sawi e y a pi d tc n q et a sus d t r n f r tx aai t p e h sg a.Th s i
维普资讯
《 动 术 应 20年 5 第1期 自 化技 与 用》06 燕2卷 2
经 验 交 流
Te hniaICOt mun c to c c l l i a i ns
用 VC #编程 实现语音合成
VC基于微软语音引擎开发语音识别总结
关于SAPI的简介API 概述SAPI API在一个应用程序和语音引擎之间提供一个高级别的接口。
SAPI 实现了所有必需的对各类语音引擎的实时的操纵和治理等低级别的细节。
SAPI引擎的两个大体类型是文本语音转换系统(TTS)和语音识别系统。
TTS系统利用合成语音合成文本字符串和文件到声音音频流。
语音识别技术转换人类的声音语音流到可读的文本字符串或文件。
文本语音转换API应用程序能通过IspVoice的对象组建模型(COM)接口操纵文本语音转换。
一旦一个应用程序有一个已成立的IspVoice对象(见Text-to-Speech指南),那个应用程序就只需要挪用ISpVoice::Speak 就能够够从文本数据取得发音。
另外,ISpVoice接口也提供一些方式来改变声音和合成属性,如语速ISpVoice::SetRate,输出音量ISpVoice::SetVolume,改变当前发言的声音ISpVoice::SetVoice 等。
特定的SAPI操纵器也能够嵌入输入文本利用来实时的改变语音合成器的属性,如声音,音调,强调字,语速和音量。
这些合成标记在中,利用标准的XML格式,这是一个简单但很壮大定制TTS语音的方式,不依托于特定的引擎和当前利用的声音。
ISpVoice::Speak方式能够用于同步的(当完全的完成朗诵后才返回)或异步的(当即返回,朗诵在后台处置)操作。
当同步朗诵(SPF_ASYNC)时,实时的状态信息如朗诵状态和当前文本位置能够通过ISpVoice::GetStatus取得。
当异步朗诵时,能够打断当前的朗诵输出以朗诵一个新文本或把新文本自动附加在当前朗诵输出的文本的末尾。
除ISpVoice接口之外SAPI也为高级TTS应用程序提供许多有效的COM接口。
事件SAPI用标准的回调机制(Window消息, 回调函数 or Win32 事件)来发送事件来和应用程序通信。
关于TTS,事件大多用于同步地输出语音。
VC++开发基于Microsoft Speech SDK的TTS软件
3 软 件 设 计
软 件实 现 的功 能 :一 是将 文 本转 换 为语 音进 行 播放 ,二是 将 文本转 换 为语 音保 存为 WA V 文件 。软 件运 行界 面如 图 1 所示 。
S p e e c h S D K提 供 一 套 关 于 语 音 处 理 的应 用 程 序 编 程 接 1 : 3 S A P I ( S p e e c h A p p l i c a t i o n P r o g r a m m i n g I n t e r f a c e ) ,S A P I 提 供 了 开 发 文 语 转换 ( T e x t - t o — S p e e c h )程 序 和语 音 识 别 ( S p e e c h R e c o g n i t i o n ) 程 序 的基 本 函数 ,大 大 简化 语 音 编程 的难 度 ,降低 语 音编 程 的工
摘 要 :基 于 Mi c r o s o f t S p e e c h S DK提 供 的 S A P I 函数 ,用 VC+ + 编 写 文语 转换 程 序 ,给 出 了实现 代 码 ,完成 文 本 朗读 和语 音保 存 为 W A V 文件 功能 。 关键 词 :T T S软 件 ;S A P I 函数 ;I S p V o i c e 接 口;语 音库
的过程 ,这 个过 音
素 ,并 对 文 本 中的数 字 、货 币单 位 、单 词变 形 以及 标 点 等需 要 特
殊 处 理 的符 号 进 行 分 析 ,将 音 素 生 成 数 字 音 频 ,然 后 用 扬 声 器
播 放 出 来 或 者 保 存 为 声 音 文 件 用 音 频 播 放 器 播 放 。 Mi c r o s o f t
用VC6.0实现TTS
1.TTS技术概述上世纪90年代中期以来,随着个人计算机的硬件和软件功能越来越强,和现代语音技术的发展,以前在科幻电影中才能看到的会说话的电脑已经成为现实。
而TTS技术正是电脑能够说话的关键技术之一。
TTS是text-to-speech的缩写,英文也称Speech Synthesis即语音合成。
语音合成就是一个将文本转化为语音输出的过程,这个过程的工作主要是将输入的文本按字或词分解为音素,并且对文本中的数字、货币单位、单词变形以及标点等要特殊处理的符号进行分析,以及将音素生成数字音频然后用扬声器播放出来或者存为声音文件以后用多媒体软件播放。
当应用程序需要发声的时候就调用语音合成引擎(SPEECH SYNTHESIS ENGINE)进行语言合成,将文本处理后通过扬声器用近似于人的声音“读”出来,通常还可以通过改变对语音引擎的设置改变“说话”的速度,声音频率(低沉或者尖锐),声音大小,还能模拟口形、唇形和舌位的变化对声音的影响。
面前计算机通过语音合成发出的声音效果听起来就象是录音磁带发出的声音。
与一些用预先录制的声音文件实现发声的应用程序相比,TTS的发声引擎只有几兆大小,不需要大量的声音文件支持,因此可以节省很大的储存空间,并且可以朗读预先未知的任何语句。
现在已经有许多应用软件应用TTS技术实现语音功能,例如一些播音软件可以用来读小说或作校对工作,还可以朗读电子邮件,一些电子词典可以读出单词,还可以用于查询中心自动播放服务信息等。
2.关于Microsoft Speech SDK实现TTS的核心技术本身是非常复杂的,不是一般开发人员所能完成的,但是有了Microsoft Speech SDK这样的工具的帮助,只需要在应用程序中加入一些不太复杂的命令和操作,我们就可以创建具有TTS功能的应用程序了。
国内外有许多高科技公司和科研机构致力于TTS技术的开发和研究,如微软公司、IBM公司以及国内的科大迅飞公司都有较成熟的语音产品,并且任何人都可以获得微软公司免费提供的语音软件开发工具:Microsoft Speech SDK。
Visual C++2010开发基于Windows 7的语音识别与语音合成
合成的快感 ,欣 赏微软Wid ws7 n o 新技
术给人们带来的便利,自己实现 语音交 互技术 ,让 自己开发的软件 ( 准备运行 在Wi o s7 n w 上的)可 以与用户进行语 d
音 交互 。Wid w 的语音识别和语音 n o s7
图1 插 入控件
语音合成和语音识别技术是实现人 合成与Vs 和X 的有所不 同,Wi d yuyin::工 nitializeSpeech
R c g t O E i e( r y e o ni i n ng n ar a <
R o n edf y e : bj c ec g iz S st m: O t e
sender, S peechRecognized
1创建一个CL . R的Wid ws oms no r F
se c p e h。
列代码 ,以添加对于语音技术的引用和
pi t 的项 目,命 名 为CSDN- c o 语音识别是使机器通过分析和理解 Ap l a in
的尖端技术。它是-F交叉学科,涉及信 ]
号处理、模式识别、概率论和信息论、发 音识别技术与语音合成技术一同成为实现 人机语音通信,建立有听和讲能力的语音 系统所必需的两项关键技术。 让我们 来体验一 下用Viu l + s a C+
peh d w 声机理和听觉机理、人工智能等领域。语 s e c 项 目属性 ,单击 按钮A dNe
Mut da e h oo yl lme i c n lg 多媒体技术 i T
6试 听来 I n o 的语音 朗 .  ̄Wid ws 7 读声音效果 ,如图3 。
sender,S peechHypothesized EventArgs e) void recognizer Speec h
文本转化为语音的VC_编程方法
demo. vt = VT —BSTR ; demo. bstrVal = SysAllocString (L″autospeech″) ; / / autospeech 为本程序的名字
demoexe. vt = VT —BSTR ; demoexe. bstrVal = SysAllocString (L″autospeech. exe″) ; pDispatch - > Register (demo. bstrVal ,demoexe. bstrVal) ; / / 注册该应用程序 ,即 autospeech
CoUninitialize () ;
/ / 最后删除初始化
从上面可看出 ,用 Invoke 函数间接调用时 ,其中的传递参
数写起来既麻烦也不直观 。因此本文只讲述后一种调用方法
的步骤 :
1) 用VC + + 建立一应用程序 ;
2) 运行工具菜单下的 OLE/ COM Object Viewer 程序 ; 3) 选中类库下的 Voice Text Object Library ,运行 File 菜单 下的 View 项 ,再选中 Save as 保存文件 ,该文件后缀为 IDL ;
# include ″Vtxtauto. h″ # include ″Vtxtauto —i . c″
6) 按常规编写程序 ,其中服务器按进程外服务器使用 ,
文本发音的基本函数调用方法可参考 Vtxtauto. h 文件 。
在 Vtxtauto. h 文件中列出了接口内的方法和属性 ,下面仅 列出了要用到的基本函数 :
文本转化为语音的 VC + +编程方法
吕 夏 (南京理工大学 机械学院 ,江苏 南京 210094)
基于VisualC 2010开发基于Windows7的语音识别与语音合成-程序员投稿课案
基于Visual C++2010开发基于Windows7的语音识别与语音合成-----语音技术业内资深专家尹成力作Windows7相比Vista已经进一步改善了语音技术的体验,改进了语音识别的识别率与语音合成的朗读声音效果。
语音技术与多点触摸是Windows7最耀眼的技术靓点之一。
语音合成和语音识别技术是实现人机语音通信,建立一个有听和讲能力的口语系统所必需的两项关键技术。
使电脑具有类似于人一样的说话能力,是当今时代信息产业的重要竞争市场。
语音合成,又称文语转换(Text to Speech)技术,能将任意文字信息实时转化为标准流畅的自然语音并朗读出来。
它涉及声学、语言学、数字信号处理、计算机科学等多个学科,是中文信息处理领域的一项前沿技术,解决的主要问题就是如何将文字信息转化为可听的声音信息,即让机器像人一样开口说话。
语音识别,就是让机器通过分析和理解过程把语音信号转变为相应的文本或命令的尖端技术。
语音识别是一门交叉学科,所涉及的领域包括:信号处理、模式识别、概率论和信息论、发声机理和听觉机理、人工智能等等。
语音识别技术与语音合成技术一同成为实现人机语音通信,建立有听和讲能力的语音系统所必需的两项关键技术。
让我们来体验下用Visual C++2010开发Windows7的语音识别与语音合成的快感,欣赏微软最新的Windows7新技术给人们带来的便利。
自己实现语音交互技术,让自己开发的软件(准备运行在Windows7上的)可以与用户进行语音交互。
Windows7的语音识别与语音合成与Vista与XP的有所不同,Windows7下开发的应用于Vista与XP可能会遇到API兼容问题。
因为Windows7都已经附带了.Net平台,本文讲述用Visual C++2010开发基于CLR的语音技术应用程序,并同时提供了基于MFC程序兼容调用CLR的办法,无论Visual C++基于CLR或者MFC的程序,如果想升级到Windows7,都可以很快为自己添加语音识别功能,语音朗读功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文本语音(Text-to-Speech,以下简称TTS),它的作用就是把通过TTS引擎把文本转化为语音输出。
本文不是讲述如何建立自己的TTS引擎,而是简单介绍如何运用Microsoft Speech SDK建立自己的文本语音转换应用程序。
Microsoft Speech SDK简介Microsoft Speech SDK是微软提供的软件开发包,提供的Speech API(SAPI)主要包含两大方面:1.API for Text-to-Speech2.API for Speech Recognition其中API for Text-to-Speech,就是微软TTS引擎的接口,通过它我们可以很容易地建立功能强大的文本语音程序,金山词霸的单词朗读功能就用到了这写API,而目前几乎所有的文本朗读工具都是用这个SDK开发的。
至于API for Speech Recognition就是与TTS 相对应的语音识别,语音技术是一种令人振奋的技术,但由于目前语音识别技术准确度和识别速度不太理想,还未达到广泛应用的要求。
Microsoft Speech SDK可以在微软的网站免费下载,目前的版本是5.1,为了支持中文,还要把附加的语言包(LangPack)一起下载。
为了在VC中使用这SDK,必需在工程中添加SDK的include和lib目录,为免每个工程都添加目录,最好的办法是在VC的Tools->Options->Directories立加上SDK的include和lib目录。
一个最简单的例子先看一个入门的例子:#include<sapi.h>#pragma comment(lib,"ole32.lib")//CoInitialize CoCreateInstance需要调用ole32.dll#pragma comment(lib,"sapi.lib")//sapi.lib在SDK的lib目录,必需正确配置int main(int argc,char*argv[]){ISpVoice*pVoice=NULL;//COM初始化:if(FAILED(::CoInitialize(NULL)))return FALSE;//获取ISpVoice接口:HRESULT hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice);if(SUCCEEDED(hr)){hr=pVoice->Speak(L"Hello world",0,NULL);pVoice->Release();pVoice=NULL;}//千万不要忘记:::CoUninitialize();return TRUE;}短短20几行代码就实现了文本语音转换,够神奇吧。
SDK提供的SAPI是基于COM封装的,无论你是否熟悉COM,只要按部就班地用CoInitialize(),CoCreateInstance()获取IspVoice接口就够了,需要注意的是初始化COM后,程序结束前一定要用CoUninitialize()释放资源。
IspVoice接口主要函数上述程序的流程是获取IspVoice接口,然后用ISpVoice::Speak()把文本输出为语音,可见,程序的核心就是IspVoice接口。
除了Speak外IspVoice接口还有许多成员函数,具体用法请参考SDK的文档。
下面择要说一下几个主要函数的用法:HRESULT Speak(const WCHAR*pwcs,DWORD dwFlags,ULONG*pulStreamNumber);功能:就是speak了参数:*pwcs输入的文本字符串,必需为Unicode,如果是ansi字符串必需先转换为Unicode。
dwFlags用来标志Speak的方式,其中SPF_IS_XML表示输入文本含有XML标签,这个下文会讲到。
PulStreamNumber输出,用来获取去当前文本输入的等候播放队列的位置,只有在异步模式才有用。
HRESULT Pause(void);HRESULT Resume(void);功能:一看就知道了。
HRESULT SetRate(long RateAdjust);HRESULT GetRate(long*pRateAdjust);功能:设置/获取播放速度,范围:-10to10HRESULT SetVolume(USHORT usVolume);HRESULT GetVolume(USHORT*pusVolume);功能:设置/获取播放音量,范围:0to100HRESULT SetSyncSpeakTimeout(ULONG msTimeout);HRESULT GetSyncSpeakTimeout(ULONG*pmsTimeout);功能:设置/获取同步超时时间。
由于在同步模式中,电泳Speak后程序就会进入阻塞状态等待Speak返回,为免程序长时间没相应,应该设置超时时间,msTimeout单位为毫秒。
HRESULT SetOutput(IUnknown*pUnkOutput,BOOL fAllowFormatChanges);功能:设置输出,下文会讲到用SetOutput把Speak输出问WAV文件。
这些函数的返回类型都是HRESULT,如果成功则返回S_OK,错误有各自不同的错误码。
使用XML个人认为这个TTS api功能最强大之处在于能够分析XML标签,通过XML标签设置音量、音调、延长、停顿,几乎可以使输出达到自然语音效果。
前面已经提过,把Speak参数dwFlags设为SPF_IS_XML,TTS引擎就会分析XML文本,输入文本并不需要严格遵守W3C的标准,只要含有XML标签就行了,下面举个例子:……pVoice->Speak(L"<VOICE REQUIRED=''NAME=Microsoft Mary''/>volume<VOLUME LEVEL=''100''>turn up</VOLUME>",SPF_IS_XML,NULL);……<VOICE REQUIRED=''NAME=Microsoft Mary''/>标签把声音设为Microsoft Mary,英文版SDK中一共含有3种声音,另外两种是Microsoft Sam和Microsoft Mike。
……<VOLUME LEVEL=''100''>把音量设为100,音量范围是0~100。
另外:标志音调(-10~10):<PITCH MIDDLE="10">text</PITCH>注意:"号在C/C++中前面要加\,否则会出错。
标志语速(-10~10):<RATE SPEED="-10">text</RATE>逐个字母读:<SPELL>text</SPELL>强调:<EMPH>text</EMPH>停顿200毫秒(最长为65,536毫秒):<SILENCE MSEC="200"/>控制发音:<PRON SYM=''h eh-l ow1''/>这个标签的功能比较强,重点讲一下:所有的语言发音都是由基本的音素组成,拿中文发音来说,拼音是组成发音的最基本的元素,只要知道汉字的拼音,即使不知道怎么写,我们可知道这个字怎么都,对于TTS引擎来说,它不一定认识所有字,但是你把拼音对应的符号(SYM)给它,它就一定能够读出来,而英语发音则可以用音标表示,''h eh-l ow1''就是hello这个单词对应的语素。
至于发音与符号SYM具体对应关系请看SDK文档中的Phoneme Table。
再另外,数字、日期、时间的读法也有一套规则,SDK中有详细的说明,这里不说了(懒得翻译了),下面随便抛个例子:<context ID="date_ymd">1999.12.21</context >会读成"December twenty first nineteen ninety nine"XML标签可以嵌套使用,但是一定要遵守XML标准。
XML标签确实好用,效果也不错,但是……缺点:一个字―――"烦",如果给一大段文字加标签,简直痛不欲生。
把文本语音输出为WAV文件#include<sapi.h>#include<sphelper.h>#pragma comment(lib,"ole32.lib")#pragma comment(lib,"sapi.lib")int main(int argc,char*argv[]){ISpVoice*pVoice=NULL;if(FAILED(::CoInitialize(NULL)))return FALSE;HRESULT hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice);if(SUCCEEDED(hr)){CComPtr<ISpStream>cpWavStream;CComPtr<ISpStreamFormat>cpOldStream;CSpStreamFormat OriginalFmt;pVoice->GetOutputStream(&cpOldStream);OriginalFmt.AssignFormat(cpOldStream);hr=SPBindToFile(L"D:\\output.wav",SPFM_CREATE_ALWAYS,&cpWavStream,&OriginalFmt.FormatId(),OriginalFmt.WaveFormatExPtr());if(SUCCEEDED(hr)){pVoice->SetOutput(cpWavStream,TRUE);WCHAR WTX[]=L"<VOICE REQUIRED=''NAME=Microsoft Mary''/>text to wave";pVoice->Speak(WTX,SPF_IS_XML,NULL);pVoice->Release();pVoice=NULL;}}::CoUninitialize();return TRUE;}SPBindToFile把文件绑定到输出流上,而SetOutput把输出设为绑定文件的流上。