关于只支持数字变更的叫号系统语言播放

最近项目开发过程中一个需要语音合成的叫号语音播放,调研了国内的语音合成软件供应商,目前有科大讯飞和捷通华声两家比较成熟的企业。

但在联系过程中发现,语音合成的价格都比较昂贵,价格都是上万的,对于我们这个小项目开发来说,购买这个昂贵的系统显然不划算。

先说下我们的需求:

播放:顾客卡号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();
        }
    }

posted @ 2011-06-08 21:11  鼹鼠贪贪  阅读(477)  评论(4编辑  收藏  举报