关于只支持数字变更的叫号系统语言播放
最近项目开发过程中一个需要语音合成的叫号语音播放,调研了国内的语音合成软件供应商,目前有科大讯飞和捷通华声两家比较成熟的企业。
但在联系过程中发现,语音合成的价格都比较昂贵,价格都是上万的,对于我们这个小项目开发来说,购买这个昂贵的系统显然不划算。
先说下我们的需求:
播放:顾客卡号XXX到XX窗口取菜。
由于需求比较简单,因此,决定以音频文件拼接的方式实现。
事先我们拿到了捷通华声的试用版,采用他们的语音文件进行处理。当然,也可以自己录制相应的音频文件。
首先,剥离我们需要播放的内容文字:顾客卡号,到,窗口取菜,数字0-9。四个部分,分别录制相应的音频文件。
采用c#winform开发,调用了windows media player控件播放语音,将音频文件排序成我们需要的队列,放入播放列表,进行顺序播放,即实现了只有数字变化的语音播放程序。
以下是源代码,请大牛多多点评!
/// <summary>
/// 判断字符串是否为无符号数字
/// </summary>
/// <param name="value">待判定的字符串</param>
/// <returns>true: 是无符号数字; false: 不是无符号数字</returns>
public static bool IsUnsign(string value)
{
return Regex.IsMatch(value, @"^\d*[.]?\d*$");
}
AxWMPLib.AxWindowsMediaPlayer axplay;
/// <summary>
/// 语音播放
/// </summary>
/// <param name="StrCardCode">顾客卡号,只支持纯数字</param>
/// <param name="StrScreenShow">窗口号,只支持纯数字</param>
/// <param name="StrPlease">“顾客卡号”音频文件地址</param>
/// <param name="StrArrive">“到”音频文件地址</param>
/// <param name="StrGetGoods">“窗口取菜”音频文件地址</param>
/// <param name="StrNumber0">数字“0”音频文件地址</param>
/// <param name="StrNumber1">数字“1”音频文件地址</param>
/// <param name="StrNumber2">数字“2”音频文件地址</param>
/// <param name="StrNumber3">数字“3”音频文件地址</param>
/// <param name="StrNumber4">数字“4”音频文件地址</param>
/// <param name="StrNumber5">数字“5”音频文件地址</param>
/// <param name="StrNumber6">数字“6”音频文件地址</param>
/// <param name="StrNumber7">数字“7”音频文件地址</param>
/// <param name="StrNumber8">数字“8”音频文件地址</param>
/// <param name="StrNumber9">数字“9”音频文件地址</param>
public void CallSound(string StrCardCode,string StrScreenShow,string StrPlease, string StrArrive, string StrGetGoods, string StrNumber0, string StrNumber1, string StrNumber2, string StrNumber3, string StrNumber4, string StrNumber5, string StrNumber6, string StrNumber7, string StrNumber8, string StrNumber9)
{
//如果WMP控件存在,并且处于准备播放状态,清空播放列表,避免在第二次播放的时候仍然播放第一条记录
if (axplay !=null && axplay.playState == WMPLib.WMPPlayState.wmppsReady)
{
axplay.currentPlaylist.clear();
}
//判断顾客卡号是否为非数字
if (!IsUnsign(StrCardCode))
{
return;
}
//判断显示窗口是否为数字
if (!IsUnsign(StrScreenShow))
{
return;
}
//初始化WMP控件
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
if (this.axplay == null)
this.axplay = new AxWMPLib.AxWindowsMediaPlayer();
((System.ComponentModel.ISupportInitialize)(this.axplay)).BeginInit();
this.SuspendLayout();
this.axplay.Enabled = true;
this.axplay.Location = new System.Drawing.Point(271, 97);
this.axplay.Name = "axWindowsMediaPlaye2";
this.axplay.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWindowsMediaPlayer1.OcxState")));
this.axplay.Size = new System.Drawing.Size(305, 204);
this.axplay.TabIndex = 8;
this.Controls.Add(this.axplay);
((System.ComponentModel.ISupportInitialize)(this.axplay)).EndInit();
//播放列表音频文件加载
string number;
List<string> StrUrl = new List<string>();
number = StrPlease;
StrUrl.Add(number);
//读取卡号,加载相应的数字音频
for (int i = 0; i < StrCardCode.Length; i++)
{
switch (StrCardCode.Substring(i, 1))
{
case "0":
number = StrNumber0;
break;
case "1":
number = StrNumber1;
break;
case "2":
number = StrNumber2;
break;
case "3":
number = StrNumber3;
break;
case "4":
number = StrNumber4;
break;
case "5":
number = StrNumber5;
break;
case "6":
number = StrNumber6;
break;
case "7":
number = StrNumber7;
break;
case "8":
number = StrNumber8;
break;
case "9":
number = StrNumber9;
break;
default:
number = StrNumber0;
break;
}
StrUrl.Add(number);
}
number = StrArrive;
StrUrl.Add(number);
//读取窗口号,加载相应的数字音频
for (int i = 0; i < StrScreenShow.Length; i++)
{
switch (StrScreenShow.Substring(i, 1))
{
case "0":
number = StrNumber0;
break;
case "1":
number = StrNumber1;
break;
case "2":
number = StrNumber2;
break;
case "3":
number = StrNumber3;
break;
case "4":
number = StrNumber4;
break;
case "5":
number = StrNumber5;
break;
case "6":
number = StrNumber6;
break;
case "7":
number = StrNumber7;
break;
case "8":
number = StrNumber8;
break;
case "9":
number = StrNumber9;
break;
default:
number = StrNumber0;
break;
}
StrUrl.Add(number);
}
number = StrGetGoods;
StrUrl.Add(number);
foreach (string fn in StrUrl)
{
//添加播放列表
axplay.currentPlaylist.appendItem(axplay.newMedia(fn));
}
//播放
axplay.Ctlcontrols.play();
}
}