利用Kinect语音识别控制51单片机

发布者:Tianyun2021最新更新时间:2017-01-22 来源: eefocus关键字:Kinect  语音识别  51单片机 手机看文章 扫描二维码
随时随地手机看文章

第六章:利用Kinect语音识别控制51单片机


WPF部分:


(1) 新建 Visual C# --> WPF工程(如下图),记得右键点击“引用”,添加相应驱动版本的Microsoft.Kinect.dll 和Microsoft.Speech动态库。App.xaml 文件及 App.xaml.cs文件无需改动。




(2)下面是MainWindow.xaml.cs文件的内容。


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;


using Microsoft.Kinect;

using Microsoft.Speech.AudioFormat;

using Microsoft.Speech.Recognition;


using System.IO;


using System.IO.Ports; //跟串口相关,不能只是引用system.IO

using System.Threading; //跟串口相关,线程的引入


namespace VoiceControlLED

{

    ///

    /// Interaction logic for MainWindow.xaml

    ///

    public partial class MainWindow : Window

    {   


        KinectSensor myKinect;

        ///

        /// 音控相关

        ///

        RecognizerInfo kinectRecognizerInfo;

        SpeechRecognitionEngine recognizer;

        KinectAudioSource kinectSource;

        Stream audioStream;


        ///

        /// 串口相关

        ///

        ///

        delegate void HandleInterfaceUpdateDelagate(string text);//委托;此为重点

        ///

        /// 实例化串口

        ///

        SerialPort serialPort1 = new SerialPort();

        ///

        /// 串口初始化函数

        ///

       private void SerialPort1_Init()

        {

            serialPort1.PortName = "COM1";  //串口号(参考串口调试助手)

            serialPort1.BaudRate = 9600;    //波特率

            serialPort1.Parity = Parity.None; //校验位

            serialPort1.DataBits = 8;       //数据位

            serialPort1.StopBits = StopBits.One;    //停止位


            if (!serialPort1.IsOpen)

            {

                serialPort1.Open();

            }

            else

                MessageBox.Show("Port is open!"); 

        }


        ///

        /// 发送字节数据函数

        ///

        ///

        ///

       private int send_command(string Command)

       {

           try

           {

               serialPort1.Write(Command);

               return (1);

           }

           catch (Exception)

           {

             // comm error

               return (0);

           }

       }


        private RecognizerInfo findKinectRecognizerInfo()

        {

            var recognizers = SpeechRecognitionEngine.InstalledRecognizers();


            foreach (RecognizerInfo recInfo in recognizers)

            {

                // look at each recognizer info value to find the one that works for Kinect

                if (recInfo.AdditionalInfo.ContainsKey("Kinect"))

                {

                    string details = recInfo.AdditionalInfo["Kinect"];

                    if (details == "True" && recInfo.Culture.Name == "en-US")

                    {

                        // If we get here we have found the info we want to use

                        return recInfo;

                    }

                }

            }

            return null;

        }


        private void createSpeechEngine()

        {

            kinectRecognizerInfo = findKinectRecognizerInfo();


            if (kinectRecognizerInfo == null)

            {

                MessageBox.Show("Kinect recognizer not found", "Kinect Speech Demo");

                Application.Current.Shutdown();

                return;

            }


            try

            {

                recognizer = new SpeechRecognitionEngine(kinectRecognizerInfo);

            }

            catch

            {

 MessageBox.Show("Speech recognition engine could not be loaded", "Kinect Speech Demo");

                Application.Current.Shutdown();

            }

        }


        private void buildCommands()

        {

            Choices commands = new Choices();


            commands.Add("One");

            commands.Add("Two");

            commands.Add("Three");

            commands.Add("Four");

            commands.Add("Five");

            commands.Add("Six");

            commands.Add("Seven");

            commands.Add("Eight");


            GrammarBuilder grammarBuilder = new GrammarBuilder();


            grammarBuilder.Culture = kinectRecognizerInfo.Culture;

            grammarBuilder.Append(commands);


            Grammar grammar = new Grammar(grammarBuilder);


            recognizer.LoadGrammar(grammar);

        }


        private void setupAudio()

        {

            try

            {

                myKinect = KinectSensor.KinectSensors[0];

                myKinect.Start();

                kinectSource = myKinect.AudioSource;

                kinectSource.BeamAngleMode = BeamAngleMode.Automatic;

                audioStream = kinectSource.Start();

                recognizer.SetInputToAudioStream(audioStream, new SpeechAudioFormatInfo(

                                                      EncodingFormat.Pcm, 16000, 16, 1,

                                                      32000, 2, null));

                recognizer.RecognizeAsync(RecognizeMode.Multiple);

            }

            catch

            {

                MessageBox.Show("Audio stream could not be connected", "Kinect Speech Demo");

                Application.Current.Shutdown();

            }

        }



        private void SetupSpeechRecognition()

        {

            createSpeechEngine();


            buildCommands();


            setupAudio();


            recognizer.SpeechRecognized +=

                new EventHandler(recognizer_SpeechRecognized);

        }


        void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)

        {

            if (e.Result.Confidence > 0.90f)  //判断声音识别可信度

            {

                wordTextBlock.Text = e.Result.Text;

            }


            wordTextBlock.Text = e.Result.Text;


            if (wordTextBlock.Text == "One")

                send_command("1");     //发送(字节数据)字符1


            if (wordTextBlock.Text == "Two")

                send_command("2");


            if (wordTextBlock.Text == "Three")

                send_command("3");



          if (wordTextBlock.Text == "Four")

                send_command("4");


            directionTextBlock.Text = kinectSource.BeamAngle.ToString() + " degrees";

            directionSlider.Value = kinectSource.BeamAngle;

        }



        public MainWindow()

        {

            InitializeComponent();

        }


        private void Window_Loaded(object sender, RoutedEventArgs e)

        {

            SetupSpeechRecognition();

            SerialPort1_Init();

        }

    }

}


(3)下面是MainWindow.xaml.cs的内容。



 1

 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

 4         Title="Color Recognizer" SizeToContent="WidthAndHeight" Loaded="Window_Loaded">

 5    

 6        

 7        

 8        

 9    

10


 


51单片机部分:


我选用的是STC89C52RC型号的单片机,带有串口通信的51单片机应该都可以,但可能设置上有些不同。


下面是C语言代码(可参考郭天祥著的51单片机C语言编程)。


 1 #include

 2 #define uchar unsigned char

 3 #define uint unsigned int

 4 

 5 unsigned char flag,a;//此处不能用宏定义

 6 

 7 sbit LED1 = P0^0;   //按键位定义

 8 sbit LED2 = P0^1;

 9 sbit LED3 = P0^2;

10 sbit LED4 = P0^3;

11 

12 void main()

13 {

14 

15      TMOD=0x20;//设置定时器1为工作方式2

16      TH1=0xfd; //设置波特率为9600

17      TL1=0xfd; //设置波特率为9600

18      TR1=1;  //定时器T1运行控制位,当GATE为0而TR1为1时,允许T1计数

19      REN=1;  

20     

21      SM0=0;  //方式1,是十位异步收发器(8位数据)

22      SM1=1;  // 波特率可变

23     

24      EA=1;  //开总中断

25      ES=1;  //串行中断允许标志位,ES=1,允许串行中断

26      while(1)

27       {

28       

29        if(flag==1)

30         {

31          ES=0;

32          flag=0;

33 

34         switch(a)

35         {

36             case '1': LED1 = 0; break;

37 

38             case '2': LED2 = 0; break;

39 

40             case '3': LED3 = 0; break;

41 

42             case '4': LED4 = 0; break;

43 

44         }

45 

46          SBUF=a; 

47          while(!TI); 

48          TI = 0;  //发送中断标志位,中断产生自动置1

49          ES = 1;

50         }

51       }

52 }

53 

54 void ser() interrupt 4  //串口中断标志号为4

55 {

56      RI=0;   //接收中断标志位,中断产生自动置1

57 

58      a =SBUF;

59      

60      flag=1;

61 }


 


运行结果:


发音:One   单片机P0^0会亮。(注意要用sbit LED1 = P0^0进行位声明)


发音:Two   单片机P0^1会亮。


发音:Three   单片机P0^2会亮。


发音:Four   单片机P0^3会亮。


关键字:Kinect  语音识别  51单片机 引用地址:利用Kinect语音识别控制51单片机

上一篇:51单片机扩展protues仿真
下一篇:WPF与51单片机之间的串口通信

推荐阅读最新更新时间:2024-03-16 15:32

单片机成长之路(51基础篇) - 013 MCS-51单片机控制详解–T2M
T2CON:定时器控制寄存器 寄存器地址0C8H,位寻址0C8H~0CFH。 位地址 CF CE CD CC CB CA C9 C8 位符号 TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 TF2:T2溢出标记   当T2溢出时TF2=1,TD2只能用软件清除   当RCLK=1或TCLK=1时,TF2将不置位 EXF2:T2外部标记   当EXEN2=1时,T2EX/P1.1引脚上的负跳变引起T2的捕捉/重装操作,此时EXF2=1。在T2中断允许时,EXF2=1将引起中断,EXF2只能用软件清除。在T2的向上、向下计数模式下(DCEN=1)EXF2的置
[单片机]
一文解析51单片机PWM双舵机控制
  PWM简介   脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。   脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。   什么是舵机   舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。舵机是船舶上的一种大甲板机械。   本文主要介绍的是51单片机PWM双舵机控制,具体的跟随小
[单片机]
一文解析<font color='red'>51单片机</font>PWM双舵机控制
基于盲源分离的语音识别前端语音净化处理研究
  目前针对语音识别提出了很多算法,但是这些研究基本上都是基于较为纯净的语音环境,一旦待识别的环境中有噪声和干扰,语音识别就会受到严重影响.因为大多数语音识别的语音模板基本上是在无噪声和无混响的“纯净”环境中采集、转换而成.而实现环境中不可避免地存在干扰和噪声,包括其他人的声音和回声等,这些噪声有时很强,使语音识别系统的性能大大降低甚至瘫痪.已有的信号去噪、参数去噪和抗噪识别等方法都有一定的局限.如果能实现噪声和语音的自动分离,即在识别前就获得较为纯净的语音,可以彻底解决噪声环境下的识别问题.近年来取得很大进展的盲源分离为噪声和语音的分离提供了可能.盲源分离(Blind Source Separation)的算法众多且运算复杂,经
[嵌入式]
基于盲源分离的<font color='red'>语音识别</font>前端语音净化处理研究
33-基于51单片机的光照强度检测(光敏电阻)
具体实现功能 系统由STC89C52单片机+四位数码管显示+光敏电阻+ADC0804等构成。 具体功能: ①光敏电阻实时采集环境光照值; ②采用ADC0804将模拟值转换为数字量; ③四位数码管显示当前的光照值(00.0-60.0)。 设计背景 随着电子技术的发展、数字电路应用领域的扩展,现今社会,产品智能化、数字化已成为人们追求的一种趋势,设备的性能、价格、发展空间等备受人们关注。性能好的电子设备,对外围保护电路要求很高,尤其是精密仪器对光线要求等设备要求更高,为了延长设备的使用寿命。所以,在企业设备保护中,设计一款智能的光电检测电路尤为重要。 光强检测设计主要根据光敏电阻的特性制作的。光敏电阻值随受到的
[单片机]
33-基于<font color='red'>51单片机</font>的光照强度检测(光敏电阻)
51单片机-模拟倒车雷达报警
1.题目要求 我们在第九章第3讲的例程基础上,实现用超声波模块模拟倒车雷达报警的功能,当障碍物距离超声波模块小于等于10cm左右我们就用蜂鸣器鸣叫产生报警,大于10cm就不报警。代码上添加的程序量比较少,我们只是把定时时间改为200微秒好使蜂鸣器鸣叫的比较尖锐。 2.main.c测试代码 #include reg52.h #include function.h //详见第六章第8讲 #include timer.h //详见第八章第11讲 #include intrins.h sbit TRIG = P2^0; sbit ECHO = P2^1; u8 FLAG=0,BEEP_FLAG=0; void d
[单片机]
51单片机的内部结构和程序执行过程解析
注: 1.ROM:只读存储器,单片机的只读存储区大多用于存储程序固又称程序存储器。 51单片机是EPROM,所谓的EPROM是可擦除的只读存储器。可以把原来的程序擦除了,再写一个新的进去。 断电后是可以保存的,数据存储器(RAM)是不能保存的。 RAM只能在程序执行的时候不断地重新存储定义的变量。如int x,int y 可以通过code这个指令来将定义的变量放在ROM,而不是RAM中,节省RAM资源 2.RAM:随机存取存储器,用于存储定义的变量等,速度快 51单片机的RAM存储容量远小于ROM,但是速度非常之快 内部详细图示 内部的结构看似十分复杂,但是大致上可以分为两个部分:运算器(红色框)和控制器(蓝色框)
[单片机]
<font color='red'>51单片机</font>的内部结构和程序执行过程解析
51单片机串口接收和发送数据
第一种方法:在中断中处理 typedef unsigned char UINT8; volatile UINT8 u8Uart_Data; void InitialUART0_Timer1() { SCON = 0x50; //2015-05-04 TMOD = 0x20; TH1 = 0XFD; // 9600BPS 2015-05-04 TL1 = 0XFD; TR1 = 1; // start timer0 ES = 1; // Enable serial interrup
[单片机]
51单片机向PC电脑发送一组汉字的方法
最近看到有朋友在网上问 单片机 怎么向电脑发送一串汉字这个问题,其实这个问题也不难.呵呵.只要把相关的参数设置好一些,然后把汉字定义成一组字符向电脑发送就可以. 为了让大家更明确的了解,我就写了下面的一个程序来演示一下. 操作条件: 1.XP操作系统. 2.XP的超级终端显示. 3.WJ-V4.0开发板. 4.单片机STC89C52. 5. 晶振 11.0592M 操作步骤: 1.设置TMOD设置波特率和定时器1的工作方式. 2.设置定时器的初始值. 3.设置串行口工作方式. 4.设置波特率不加倍. 5.打开TR1允许发送. 6.启动定时器. 7.串行中断打开. 8.打开EA中断. 现在发上源代码: #include AT
[单片机]
<font color='red'>51单片机</font>向PC电脑发送一组汉字的方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved