春节前后的天气预报,是需要点赞的。
很多人回去了,又回来了,避开并且躲过了大雪。不是要感恩上帝,而是要得益于AI精确的算法。
AI机器人的最大法宝,就是完全听得懂人们说话,完全看得明白人们的动作和表情,进而分析得知,人们想要AI做点什么。
如果这两样做好了,精致了,那么机器人就可以随心所欲地帮助了人。
关于听得懂的模型,只说使用过的微软的语音动态库,可惜没有下载到C++的SDK。只因怕付费而没去体验,遗憾。
以下分享一下在听得懂方面的感受:
1. 一个字、两个字、三个字的单元词汇,出错较多,需要把这些分成几种类型,人为加上词的固定前后缀才行。
例如:“滚”是听得懂的,而“东”是听错了的;“你好”是听得懂的,而“你坏”是听错了的;
2.直接使用中文字库,是容易出错的。需要重新编写自己的语音字库,把第一点里的考虑加进去,改善了很多。
3.使用各种概率或者技巧的模型,错误也多。采用一对一的定制字库,就减少了错误。
例如:“你好”,字库里就是“你好”。因平常说话也就那么一些,不用担心字库会很大。
但是,如果听了“你”就开始分析,这个字连接多少个字的概率各是多少,
然后分析最大的可能性来组合算是合理的结果,就出问题了。
4.各种概率密度函数模型已经很成熟了,不知道国内的几家成功的大佬公司,是否确实用了概率算法的模型。
由于概率书籍的晦涩难懂,世界是否还有更简单一些的做法,就算昨天才开始学习AI,也能秒懂最好。
比如:一句话的分析,先是中文分词,然后进行组合的概率模型计算,再推断出结果,或者中间还有多次验证。
然后机器还要反复学习,才能求得最后的意思。
5.至于模型的复杂性,搞懂了的人很少说出来的,目前为止。
只读了一本科学家吴军的《数学之美》,确实把知道的毫无保留地告诉了读者。
虽然纯粹是兴趣,没什么打算,但是还是谢谢这样的科学家。
6.向往一种直接调用语音SDK,三两行代码就能做到听得懂、看得明白,懂你意思。
若要还好一点,就是开源了单片机语音库的程序,那就可以让有兴趣的人,随时玩玩端盘洗碗的机器人的DIY了。
7.具体的程序没有什么亮点?贴一点C#中简易实现说话听懂的试试。
数据库里有要比对的每个词或者一句话的字段,也有应对回答的字或者一句话。
不采用概率的玩法,只用最低级的说一句,答一句的办法,自己做一个吧,不停的实践,就慢慢会完整好用的。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Speech.Synthesis;
using System.Threading;
using System.Globalization;
using System.IO;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using System.Diagnostics.Contracts;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Data.SqlClient;
namespace WindowsFormsApp15
{
public partial class FrmMain : Form
{
[DllImport("kernel32.dll")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize,
int maxSize);
public static void clear_memory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
FrmMain.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
}
}
string abb = "";
string text5 = "";
public FrmMain()
{
InitializeComponent();
}
private void SpeechRecognitionCallback(object sender, SpeechRecognizedEventArgs e)
{
string result = e.Result.Text.ToLower();
abb = result;
textBox1.Text = abb;
text5= result;
this.button2.PerformClick();
}
private static SpeechSynthesizer synth = new SpeechSynthesizer();
private static Mutex creat_play_mutex = new Mutex(false, "voice_play");
private static void play_voice_process(object parameter)
{
FrmMain.creat_play_mutex.WaitOne();
string textToSpeak = (string)parameter;
FrmMain.synth.SetOutputToDefaultAudioDevice();
FrmMain.synth.Speak(textToSpeak);
FrmMain.creat_play_mutex.ReleaseMutex();
}
private void set_play_voice(string str)
{
new Thread(new
ParameterizedThreadStart(FrmMain.play_voice_process)).Start(str);
}
private void button1_Click(object sender, EventArgs e)
{
try
{
SpeechRecognitionEngine sre = new SpeechRecognitionEngine(new CultureInfo("zh-CN"));
var words = new Choices();
words.Add("办公室");
words.Add("你好点菜");
words.Add("现在天气冷了");
words.Add("有没有鸳鸯锅啊");
words.Add("微辣就可以了");
words.Add("有什么特别的介绍吗");
words.Add("有什么青菜");
words.Add("闭嘴别说话了");
words.Add("有电视看吗打开空调");
words.Add("服务员催一下菜好吗");
words.Add("傻里巴叽的");
words.Add("你今年多大了有男朋友没有");
words.Add("想和你睡觉");
words.Add("你真漂亮");
words.Add("好烦啊");
var gb = new GrammarBuilder();
gb.Culture = new System.Globalization.CultureInfo("zh-CN");
gb.Append(words);
Grammar g = new Grammar(gb);
sre.LoadGrammar(g);
sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>
(SpeechRecognitionCallback);
sre.SetInputToDefaultAudioDevice();
sre.RecognizeAsync(RecognizeMode.Multiple);
}
catch (Exception ex)
{
MessageBox.Show("init RS Error : " + ex.ToString());
}
}
private void button2_Click(object sender, EventArgs e)
{
string sql = "select count(1) from talkinglib where prob_text=@Probtext";
SqlParameter[] paras = new SqlParameter[]
{
new SqlParameter("@Probtext",text5 ),
};
object obj = SQLHelper.ExecuteScalar(sql, paras);
bool flag9 = (int)obj != 0 || (int)obj > 0;
if (flag9)
{
string sqlq = "SELECT answ_text FROM [dbo].[talkinglib]
where prob_text="+ "'" + text5 + "'";
System.Data.DataTable dt = SQLHelper.GetDataTable(sqlq);
DataRow dr = dt.Rows[0];
string talking = dr["answ_text"].ToString().Trim();
Thread.Sleep(1000);
this.set_play_voice(talking);
this.textBox2.Text = talking;
return;
}
else
{
return;
}
}
}
}
8.视觉部分、机器人执行部分暂缺。