前言
2014年时,想做一个会跳舞的,当在敲代码的时候驱动跳舞激励程序员、可以聊天的、可以语音聊 的桌面精灵
上个最后效果图 没gif
接入聊天AI
市面上的人工智能回答很多产品。比较流行的好用的有:
1.微软小娜和微软小冰,似乎是微软小娜比较好,微软小冰还处于比较基础的日常聊天,但回复内容多样,会有词语接龙、数绵羊、读心术、颜值测试和一些天气交通的日常功能等功能,而且调侃功能丰富,当年被微信封杀,却在微博刚上线的时候引发一波热潮。而相对的win10自带的微软小娜功能丰富。
2.小黄鸡。SimSimi是一款来自韩国的聊天机器人应用,以吉祥物“小鸡鸡”自居。SimSimi机器人的界面非常可爱,深受女生欢迎,最近网络上还刮起了一阵和SimSimi机器人对话的旋风。也尝试过接入,但其原本是用python写的,用Json进行应答传输,接入比较麻烦。
也尝试过小黄鸡
小黄鸡的消息上传需要编写xml或Json 对于xml或Json的处理 对于小黄鸡调用API的学习
3.图灵机器人。功能比较完善的一个自动回复机器人,是国人出品的,这次接入了这个。
图灵机器人官网:http://www.tuling123.com/
效果图
图灵机器人接入关键代码
-
using System;
-
using System.Collections.Generic;
-
using System.ComponentModel;
-
using System.Drawing;
-
using System.Linq;
-
using System.Text;
-
using System.Windows.Forms;
-
using System.Net;
-
using System.IO;
-
using Newtonsoft.Json;
-
using UnityEditor;
-
using UnityEngine;
-
namespace 聊天机器人
-
{
-
public partial
class Form1 : MonoBehaviour
-
{
-
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
-
SpVoice Voice =
new SpVoice();
-
public
string usay;
-
public
string jijisay =
"";
-
HttpWebResponse Response = null;
-
public string ConnectTuLing(string p_strMessage)
-
{
-
string result = null;
-
try {
-
String APIKEY =
"c32ccaa805b6441be76bc18074f12e51";
-
String _strMessage = p_strMessage;
-
String INFO = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(_strMessage));
-
String getURL =
"http://www.tuling123.com/openapi/api?key=" + APIKEY +
"&info=" + INFO;
-
HttpWebRequest MyRequest = (HttpWebRequest)HttpWebRequest.Create(getURL);
-
HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse();
-
Response = MyResponse;
-
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;
-
while (osize >
0) {
-
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));
-
while (reader.Read()) {
-
if (reader.Path ==
"text") {
-
result = reader.Value.ToString();
-
Debug.Log(reader.Value);
-
jijisay = reader.Value.ToString(); } } }
-
catch (Exception) {
throw; }
-
return result; }
-
-
private void btn_send_Click() {
-
string returnMess = ConnectTuLing(usay);
-
try {
-
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.FilterIndex =
2;
-
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);
-
Voice.WaitUntilDone(
5);
-
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),
"点击"))
-
btn_send_Click ();
-
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 UnityEngine;
-
using System.Collections;
-
using SpeechLib;
-
public
class WinSpeech : MonoBehaviour {
-
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
-
SpVoice Voice =
new SpVoice();
-
void OnGUI(){
-
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" {
-
-
Properties {
-
_MainTex (
"Base (RGB)",
2D) =
"white" {}
-
_TransparentColourKey (
"Transparent Colour Key", Color) = (
0,
0,
0,
1)
-
_TransparencyTolerance (
"Transparency Tolerance", Float) =
0.01
-
}
-
SubShader {
-
Pass {
-
Tags {
"RenderType" =
"Opaque" }
-
LOD
200
-
CGPROGRAM
-
#pragma vertex vert
-
#pragma fragment frag
-
#include "UnityCG.cginc"
-
struct a2v
-
{
-
float4 pos : POSITION;
-
float2 uv : TEXCOORD0;
-
};
-
struct v2f
-
{
-
float4 pos : SV_POSITION;
-
float2 uv : TEXCOORD0;
-
};
-
v2f vert(a2v input)
-
{
-
v2f output;
-
output.pos = mul (UNITY_MATRIX_MVP, input.pos);
-
output.uv = input.uv;
-
return output;
-
}
-
sampler2D _MainTex;
-
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
-
return colour;
-
}
-
ENDCG
-
}
-
}
-
}
2.vs窗口设置
3.代码设置
UpdateLayeredWindow可以设置使得窗口透明 https://baike.baidu.com/item/UpdateLayeredWindow
关键代码:
-
Win32.BLENDFUNCTION blendFunc = new Win
32.BLENDFUNCTION();
-
blendFunc.AlphaFormat = Win
32.AC_SRC_ALPHA;
-
Win32.UpdateLayeredWindow(..blendFunc..);
跳舞鼓励功能
我希望每当我敲打键盘的时候 桌面精灵能根据我敲键盘速度 模型会进行跳舞。
1.代码控制动画
-
public Image PowerFilled;
-
void Start () { Slow (); }
-
void OnGUI() {
-
Event e = Event.current;
-
if (e.isKey) {
-
if(
Time.timeScale <
1)
-
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 ());
-
}
-
void Slow (){
-
if(
Time.timeScale >
0.05)
-
{
-
Time.timeScale =
Time.timeScale -
0.02F;
-
PowerFilled.fillAmount = (float)(
Time.timeScale/
1F);
-
Invoke (
"Slow",
0.1F);
-
}
-
}
当我离开键盘,跳舞速度便慢慢地下降下来~但我发现 当我切换到别的应用程序之后 桌面精灵程序便不会继续监听我的键盘输入,失去了桌面精灵的意义。所以写了个Hook
如是我便使用了全局键盘钩子HOOK.
但这个只能在unity里使用 而不能发布exe
因为我写的这个功能 360告诉我是病毒 。。严重警告然后删了
我写之前都没意识到这件事。。
我是打算写一个桌面精灵而已
然后只要我不断打代码 她就会开始跳舞 当我afk的时候她就慢慢停下来
我觉得很好玩。。实现起来的过程很难 花了我很多时间去写。。
终于写了出来。。结果被360删了。。。
之后我意识到,我这个程序,因为是桌面精灵 所以一直处于后台运行状态
不单后台运行 它还监听了我的键盘输入
细思极恐。。
这就是盗窃密码的病毒啊
后台运行,任务栏不显示,进程的名字改了,还监听键盘。。我都做到了,虽然她是个桌面精灵。。。。。。
实际上这是我的毕设
so,以后可能会有程序猿说发个游戏或者应用给你们测试一下,其实他可能给你发了一个键盘监听程序。
键盘监听在unity里始终不太好用。因为种种原因
种种原因就不解释了 太长。因为系统防御还算是有的。
---------end---------
转载:https://blog.csdn.net/u014528558/article/details/117173279