进行语音合成和播放,其中语音合成使用的是微软的TTS:
Object strbuffer = new IntPtr();
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;//异步朗读
SpVoice voice = new SpVoice();
voice.Rate = -3;//语速
SpMemoryStream spmem = new SpMemoryStream();//内存流
spmem.Format.Type = SpeechAudioFormatType.SAFTCCITT_ALaw_8kHzMono;//语音格式为A-law 8KHz
voice.AudioOutputStream = spmem;//输出到内存中
voice.Speak(InvName, SpFlags);
voice.WaitUntilDone(50000);//等待完成或者超时
strbuffer = spmem.GetData();//获取内存中的语音内容 返回的strbuffer为object类型,而播放函数StartPlay(chnnelno i,byte[] content,int startposition , uint LengthOfBytes)中播放内容content类型为byte[],所以需要进行类型转换。
转换代码如下:
BinaryFormatter se = new BinaryFormatter();
MemoryStream memStream = new MemoryStream();
se.Serialize(memStream, strbuffer);
byte[] bobj = memStream.ToArray();
memStream.Close(); //播放
uint length = (uint)bobj.GetLength(0);//获取数组长度
Tc08a32.StartPlay(i, bobj, 0,length);//播放函数
注:
需要添加命名空间的引用:
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
本文详细介绍了如何利用微软TTS技术进行语音合成,并通过内存流输出语音内容,最后将获取的object类型数据转换为byte数组进行播放。文中涉及关键步骤包括创建对象缓冲区、设置语音属性、输出到内存流、类型转换以及播放语音内容。通过使用BinaryFormatter进行序列化和反序列化,实现不同类型的无缝转换。

被折叠的 条评论
为什么被折叠?



