您的位置:首页 > 其它

文本转声音,TTS语音实现

2012-08-21 12:23 316 查看
最近公司做的棋牌游戏,领导说客户端的聊天内容要能够实现发音,也就是说玩家发的文本还要自动读出来,如果把语音包集成到客户端势必会造成客户端安装文件大增,经商量得出此方案:B/s端实现,大致过程这样客户端请求B/S端,B/S端生成语音文件,客户端再下载。

在做文本转语音,之前用的是匿名类型+反射,不过生成的语音文件有时没声音,文件大小也只有几个字节,生成不成功,原因未知
!代码如下:

if (!string.IsNullOrEmpty(context.Request.QueryString["txt"]) && !string.IsNullOrEmpty(context.Request.QueryString["type"]))
{
try
{
string type = context.Request.QueryString["type"];
string txt = context.Request.QueryString["txt"];
string fileName = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(type + txt, "MD5");
string filePath = "/files/" + fileName + ".wav";
if (File.Exists(context.Server.MapPath(filePath)))
{
context.Response.Write(fileName); ;
}
else
{
dynamic synth = System.Activator.CreateInstance(System.Type.GetTypeFromProgID("SAPI.SpVoice"));
dynamic fileStream = System.Activator.CreateInstance(System.Type.GetTypeFromProgID("SAPI.SpFileStream"));

if (type == "2")
{
synth.Voice = synth.GetVoices("Name=VW Lily").Item(0);
}
else
{
synth.Voice = synth.GetVoices("Name=VW Liang").Item(0);
}
synth.Rate = -1;

fileStream.Open(context.Server.MapPath(filePath), SpeechStreamFileMode.SSFMCreateForWrite, false);
synth.AudioOutputStream = fileStream;
synth.Speak(txt);
synth.WaitUntilDone(1000);
synth.Dispose();
fileStream.Close();

context.Response.Write(fileName);
context.Response.End();

}
}
catch
{
context.Response.Write("0");
context.Response.End();
} }

后来换了一种方式,使用.net 3.0生成,目前可以测试正常,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Speech.Synthesis;
using System.IO;
using System.Threading;

namespace DokeeTTS
{
/// <summary>
/// _default 的摘要说明
/// </summary>
public class _default : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";

string txt = context.Request.QueryString["txt"];
string type = context.Request.QueryString["type"];
string fileName = "";

fileName = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(type + txt, "MD5");
Thread t = new Thread(() =>
{
SpeechSynthesizer syth = new SpeechSynthesizer();
if (type == "2")
{
syth.SelectVoice("VW Lily");
}
else
{
syth.SelectVoice("VW Liang");
}
string filePath = "/files/" + fileName + ".wav";
if (File.Exists(context.Server.MapPath(filePath)))
{
context.Response.Write(fileName); ;
}
else
{
syth.SetOutputToWaveFile(context.Server.MapPath(filePath));
syth.Speak(txt);
}
syth.Dispose();
});
t.Start();
t.Join();

context.Response.Write(fileName);
context.Response.Flush();
context.Response.End();

}

public bool IsReusable
{
get
{
return false;
}
}
}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: