1、Wincc语音报警及C#实现文字转语音Wincc语音报警及C#实现文字转语音Wincc语音报警Wincc本身可以利用C脚本,VBS及HORN来做语音报警,但是上述本质上是调用的已存在的音频文件,想实现播放实时更新的信息是不行的,本文主要介绍通过C脚本,VBS及HORN来实现语音报警,并最后介绍一种文字转语音-TTS的实现方法。1. C脚本实现语音报警利用C脚本实现语音报警,只能是播放WAV文件。在C脚本中添加如下代码:#include apdefap.hlong _main(char* lpszPictureName, char* lpszObjectName, char* lpszPrope
2、rtyName)void WINAPI PlaySoundA(char *pszSound,char*hmode,DWORD dwflay);#pragma code() if (GetTagBit(testsound)=1) PlaySoundA(c:wav1.wav,NULL, 1); return 0; 另外需设置触发器,如下:2. VBS实现语音报警利用VBS,实际是在调用媒体播放器,可以播放视频,代码如下:Function BackColor_Trigger(ByVal Item)Dim soundDim objWshShellsound= c:wav1.aviSet objWshS
3、hell=CreateObject(Wscript.Shell)objWshShell.Run mplay32.exe/play/close & sound,0End Function3. 利用HORN实现语音报警a.首先打开报警器b.变量设置,此处和报警记录的设置一样,如下报警记录中设置: 当testbool为1时,报警控件显示如下:4. 以上可以看出,不管哪一种方式,本质上都是在播放已经存在的文件,那比如像钢卷号什么的每次都不一样,想要实现语音播放就不可能。那么我们可以利用TTS来实现,就是翻译词典的语音功能一样。a. 首先把需要语音播放的文件存在txt文檔中,以CAL上下线带钢准备焊接为
4、例,代码如下:#include apdefap.hlong_main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)/-上线-/if(GetTagBit(OBI_Welder_Ready)&GetTagBit(B_UpPL_NextSelect)FILE* fp=fopen(D:testtest.txt,w+); /打开文档,按以下格式写入fprintf(fp,%s,%.f,%.3f,GetTagChar(IL_PL1_ID),GetTagFloat(IR_PL1_Width),GetTagFloat(I
5、R_PL1_Thick);/txt文档写入内容格式:钢卷号,宽度保留0位小数,厚度保留3位小数fclose(fp);/关闭文档/-下线-/else if(GetTagBit(OBI_Welder_Ready)&GetTagBit(B_LwPL_NextSelect)FILE* fp=fopen(D:testtest.txt,w+);fprintf(fp,%s,%.f,%.3f,GetTagChar(IL_PL2_ID),GetTagFloat(IR_PL2_Width),GetTagFloat(IR_PL2_Thick);fclose(fp);Return 0;同样的,如第一节所讲,另外需设置
6、触发器,设置完后当事件触发时txt会生成如下内容:b. 由于Wincc本身不支持TTS功能,但是计算机本身是带有TTS引擎的,因此我们可以利用微软的TTS语音引擎来实现,把txt文文件里的文字通过语音读出来,以C#实现为例,原理是通过检测txt文档的变化,当文档内容发生变化时,比如钢卷号改变就播放txt文档里面的内容,代码如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;usin
7、g System.Text;using System.Windows.Forms;using System.Threading;using System.IO;using System.Speech.Synthesis;using System.Speech; namespace YPC_TTS public partial class YPC_TTS : Form public YPC_TTS() InitializeComponent(); WatcherStrat(); string splite1; string s1, s2, s3; char c1; char c2; string
8、 s_all1; string s_all2; string s_all; Thread th;/定义线程 FileSystemWatcher watcher = new FileSystemWatcher();/文本监视 void WatcherStrat() watcher.Path = D:test; watcher.Filter = *.txt; watcher.IncludeSubdirectories = true;/允许侦测此目录下的子目录 watcher.NotifyFilter = NotifyFilters.LastWrite; watcher.Changed += new
9、 FileSystemEventHandler(OnChanged); watcher.EnableRaisingEvents = true;/开启提交事件 void OnChanged(object source, FileSystemEventArgs e) Thread.Sleep(330); watcher.EnableRaisingEvents = false; th = new Thread(calculate); th.IsBackground = true; th.Start(); Control.CheckForIllegalCrossThreadCalls = false;
10、 watcher.EnableRaisingEvents = true; private void calculate() StreamReader objReader = new StreamReader(D:testtest.txt); SpeechSynthesizer synth = new SpeechSynthesizer(); string strLine = objReader.ReadLine(); if (strLine != ) splite1 = strLine.Split(,); s1 = splite10; s2 = splite11; s3 = 钢卷厚度 + sp
11、lite12; c1 = s1.ToCharArray();/转成字符数组 if (c1.Length != 9) s_all = 入口准备焊接; else s_all1 = 钢卷号 + c10 + + c11 + + c12 + + c13 + + c14 + + c15 + + c16 + + c17 + + c18 + ,; c2 = s2.ToCharArray(); if (c2.Length = 3) s_all2 = 钢卷宽度 + c20 + + c21 + + c22 + ,; else s_all2 = 钢卷宽度 + c20 + + c21 + + c22 + + c23 + ,; s_all = 入口准备焊接 + , + s_all1 + s_all2 + s3; objReader.Close(); objReader.Dispose(); GC.Collect(); synth.Speak(s_all); synth.Dispose(); Thread.Sleep(1100); 以上完成后,就会把txt里面的内容读出来,暂时微软默认的语音引擎说中文有点难听,可以自己安装语音库,此处安装的是nerospeech,安装完后可以在以下路径选择语音:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1