前言
2014年时,想做一个会跳舞的,当在敲代码的时候驱动跳舞激励程序员、可以聊天的、可以语音聊 的桌面精灵
上个最后效果图 没gif
接入聊天AI
市面上的人工智能回答很多产品。比较流行的好用的有:
1.微软小娜和微软小冰,似乎是微软小娜比较好,微软小冰还处于比较基础的日常聊天,但回复内容多样,会有词语接龙、数绵羊、读心术、颜值测试和一些天气交通的日常功能等功能,而且调侃功能丰富,当年被微信封杀,却在微博刚上线的时候引发一波热潮。而相对的win10自带的微软小娜功能丰富。
2.小黄鸡。SimSimi是一款来自韩国的聊天机器人应用,以吉祥物“小鸡鸡”自居。SimSimi机器人的界面非常可爱,深受女生欢迎,最近网络上还刮起了一阵和SimSimi机器人对话的旋风。也尝试过接入,但其原本是用python写的,用Json进行应答传输,接入比较麻烦。
也尝试过小黄鸡 小黄鸡的消息上传需要编写xml或Json 对于xml或Json的处理 对于小黄鸡调用API的学习
3.图灵机器人。功能比较完善的一个自动回复机器人,是国人出品的,这次接入了这个。 图灵机器人官网:http://www./
效果图
图灵机器人接入关键代码
using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; public partial class Form1 : MonoBehaviour SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice Voice = new SpVoice(); public string jijisay = ''; HttpWebResponse Response = null; public string ConnectTuLing(string p_strMessage) String APIKEY = 'c32ccaa805b6441be76bc18074f12e51'; String _strMessage = p_strMessage; String INFO = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(_strMessage)); String getURL = 'http://www./openapi/api?key=' + APIKEY + '&info=' + INFO; HttpWebRequest MyRequest = (HttpWebRequest)HttpWebRequest.Create(getURL); HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse(); using (Stream MyStream = MyResponse.GetResponseStream()) long ProgMaximum = MyResponse.ContentLength; long totalDownloadedByte = 0; byte[] by = new byte[1024]; int osize = MyStream.Read(by, 0, by.Length); Encoding encoding = Encoding.UTF8; totalDownloadedByte = osize + totalDownloadedByte; result += encoding.GetString(by, 0, osize); long ProgValue = totalDownloadedByte; osize = MyStream.Read(by, 0, by.Length); } } JsonReader reader = new JsonTextReader(new StringReader(result)); if (reader.Path == 'text') { result = reader.Value.ToString(); jijisay = reader.Value.ToString(); } } } catch (Exception) { throw; } private void btn_send_Click() { string returnMess = ConnectTuLing(usay); SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice Voice = new SpVoice(); if (chkSaveToWavFile.Checked) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = 'All files (*.*)|*.*|wav files (*.wav)|*.wav'; sfd.Title = 'Save to a wave file'; sfd.RestoreDirectory = true; if (sfd.ShowDialog()== DialogResult.OK) { SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite; SpFileStream SpFileStream = new SpFileStream(); SpFileStream.Open(sfd.FileName, SpFileMode, false); Voice.AudioOutputStream = SpFileStream; Voice.Speak(txtSpeakText.Text, SpFlags); SpFileStream.Close(); } } else { Voice.Speak(txtSpeakText.Text, SpFlags); } } catch(Exception error) { MessageBox.Show('Speak error', 'SimpleTTS', MessageBoxButtons.OK, MessageBoxIcon.Error); } } void OnGUI(){ if (GUI.Button (new Rect (100, 100, 80, 50), '点击')) usay = GUI.TextArea (new Rect (0, 50, 350, 50), usay); GUI.TextField (new Rect (0, 200, 350, 50), jijisay); }
4.也试过很多ACG的自动回复机器人。像伪春菜,白丝魔理沙。但仔细玩就会发现这些与上面的不同,他们没有强大的数据库,也没有自然语言分析和模糊分析处理,只是对应内容进行回复,只有学习功能,需要玩家自己调教,显得非常的不智能。
语音与文字相互转换
想可以和AI聊天,AI可以说话
1.微软Speech.DLL 下的 TTS 和 STT引擎
Text-to-speech一般分为两个步骤: 1) 文本处理。 这一步做的事情是把文本转化成音素序列,并标出每个音素的起止时间、频率变化等信息。 作为一个预处理步骤,它的重要性经常被忽视,但是它涉及到很多值得研究的问题,比如拼写相同但读音不同的词的区分、缩写的处理、停顿位置的确定,等等。 2) 语音合成。 狭义上这一步专指根据音素序列(以及标注好的起止时间、频率变化等信息)生成语音,广义上它也可以包括文本处理的步骤。 这一步主要有三类方法: a) 拼接法,即从事先录制的大量语音中,选择所需的基本单位拼接而成。这样的单位可以是音节、音素等等;为了追求合成语音的连贯性,也常常用使用双音子(从一个音素的中央到下一个音素的中央)作为单位。拼接法合成的语音质量较高,但它需要录制大量语音以保证覆盖率。 b) 参数法,即根据统计模型来产生每时每刻的语音参数(包括基频、共振峰频率等),然后把这些参数转化为波形。参数法也需要事先录制语音进行训练,但它并不需要100%的覆盖率。参数法合成出的语音质量比拼接法差一些。 c) 声道模拟法。参数法利用的参数是语音信号的性质,它并不关注语音的产生过程。与此相反,声道模拟法则是建立声道的物理模型,通过这个物理模型产生波形。这种方法的理论看起来很优美,但由于语音的产生过程实在是太复杂,所以实用价值并不高。
测试代码
using System.Collections; public class WinSpeech : MonoBehaviour { SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice Voice = new SpVoice(); if(GUI.Button(new Rect(200,5,80,50),'Speech')) { Voice.Speak('你好', SpFlags);
2.飞讯SDK
3.Kinect (含Kinect的语音识别功能) 之后转换成信息(错误率可能很高) 再转给小黄鸡... 识别语音之后3D模型要做的事情 [Kinect speech的使用] Kinect v2 SDK包 额外下载 == Microsoft speech SDK + MSKinectLangPack_enUS.msi.
窗口制作
1.unity shader 使用传统的CustomChromakey方法 + 窗口化和置顶(DLL) 相当于抠色的功能的,取像素点颜色,判断颜色是否在阀值内,进行除去
Shader 'Custom/ChromakeyTransparent' { _MainTex ('Base (RGB)', 2D) = 'white' {} _TransparentColourKey ('Transparent Colour Key', Color) = (0,0,0,1) _TransparencyTolerance ('Transparency Tolerance', Float) = 0.01 Tags { 'RenderType' = 'Opaque' } float4 pos : SV_POSITION; output.pos = mul (UNITY_MATRIX_MVP, input.pos); float3 _TransparentColourKey; float _TransparencyTolerance; float4 frag(v2f input) : SV_Target // What is the colour that *would* be rendered here? float4 colour = tex2D(_MainTex, input.uv); // Calculate the different in each component from the chosen transparency colour float deltaR = abs(colour.r - _TransparentColourKey.r); float deltaG = abs(colour.g - _TransparentColourKey.g); float deltaB = abs(colour.b - _TransparentColourKey.b); // If colour is within tolerance, write a transparent pixel if (deltaR < _TransparencyTolerance && deltaG < _TransparencyTolerance && deltaB < _TransparencyTolerance) return float4(0.0f, 0.0f, 0.0f, 0.0f); // Otherwise, return the regular colour
2.vs窗口设置
3.代码设置
UpdateLayeredWindow可以设置使得窗口透明 UpdateLayeredWindow_百度百科
关键代码:
Win32.BLENDFUNCTION blendFunc = new Win32.BLENDFUNCTION(); blendFunc.AlphaFormat = Win32.AC_SRC_ALPHA; Win32.UpdateLayeredWindow(..blendFunc..);
跳舞鼓励功能
我希望每当我敲打键盘的时候 桌面精灵能根据我敲键盘速度 模型会进行跳舞。
1.代码控制动画
public Image PowerFilled; void Start () { Slow (); } Time.timeScale = Time.timeScale + 0.05F; GUI.Box (new Rect (5, 50, 80, 50),e.keyCode.ToString ()); GUI.Box (new Rect (5, 5, 80, 50), Time.timeScale.ToString ()); if(Time.timeScale > 0.05) Time.timeScale = Time.timeScale - 0.02F; PowerFilled.fillAmount = (float)(Time.timeScale/1F);
当我离开键盘,跳舞速度便慢慢地下降下来~但我发现 当我切换到别的应用程序之后 桌面精灵程序便不会继续监听我的键盘输入,失去了桌面精灵的意义。所以写了个Hook
2.HOOK使用:全局键盘钩子
如是我便使用了全局键盘钩子HOOK. 但这个只能在unity里使用 而不能发布exe 因为我写的这个功能 360告诉我是病毒 。。严重警告然后删了 我写之前都没意识到这件事。。 我是打算写一个桌面精灵而已 然后只要我不断打代码 她就会开始跳舞 当我afk的时候她就慢慢停下来 我觉得很好玩。。实现起来的过程很难 花了我很多时间去写。。 终于写了出来。。结果被360删了。。。 之后我意识到,我这个程序,因为是桌面精灵 所以一直处于后台运行状态 不单后台运行 它还监听了我的键盘输入 细思极恐。。 这就是盗窃密码的病毒啊 后台运行,任务栏不显示,进程的名字改了,还监听键盘。。我都做到了,虽然她是个桌面精灵。。。。。。 实际上这是我的毕设
so,以后可能会有程序猿说发个游戏或者应用给你们测试一下,其实他可能给你发了一个键盘监听程序。 键盘监听在unity里始终不太好用。因为种种原因 种种原因就不解释了 太长。因为系统防御还算是有的。
---------end---------
|