Unity 声音处理 之 语音识别

音量检测

检测当前麦克风的输入音量

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class NewBehaviourScript2 : MonoBehaviour
{
     private static int VOLUME_DATA_LENGTH = 128;    //录制的声音长度

    public float volume;        //音量

    public Text text;

    public Slider slider;

    private AudioClip mMicrophoneRecode;  //录制的音频
    private string mDeviceName;           //设备名称

    public int xishu=1000;
    private const int frequency = 44100; //码率
    private const int lengthSec = 999;   //录制时长

    // Use this for initialization
    void Start () {
        //获取设备名称
        mDeviceName = Microphone.devices[0];
        
      
        //录制一段音频
        mMicrophoneRecode = Microphone.Start(mDeviceName, true, lengthSec, frequency);
    }
    
    // Update is called once per frame
    void Update () {
        volume = GetMaxVolume();
        volume*=xishu;
        slider.value=Mathf.Lerp(slider.value,volume/200,0.1f);
        text.text=volume.ToString();
    }

    /// <summary>
    /// 获取最大的音量
    /// </summary>
    /// 
    /// <returns>
    /// 音量大小
    /// </returns>
    private float GetMaxVolume()
    {
        float maxVolume = 0f;

        //用于储存一段时间内的音频信息
        float[] volumeData = new float[VOLUME_DATA_LENGTH];

        int offset;
        //获取录制的音频的开头位置
        offset = Microphone.GetPosition(mDeviceName) - VOLUME_DATA_LENGTH + 1;

        if(offset < 0)
        {
            return 0f;
        }

        //获取数据
        mMicrophoneRecode.GetData(volumeData, offset);

        //解析数据
        for(int i = 0;i < VOLUME_DATA_LENGTH; i++)
        {
            float tempVolume = volumeData[i];
            if(tempVolume > maxVolume)
            {
                maxVolume = tempVolume;
            }
        }

        return maxVolume;
    }
}

 

关键字识别

此处利用win10自带的识别

记得引入

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.Windows.Speech;//引入命名空间  利用
 5 using SpeechLib;
 6 public class NewBehaviourScript1 : MonoBehaviour
 7 {
 8     // 短语识别器
 9     private PhraseRecognizer m_PhraseRecognizer;
10     // 关键字
11 
12     public string[] keywords;
13 
14     public GameObject xiangdu;
15    
16     // 可信度
17     public ConfidenceLevel m_confidenceLevel = ConfidenceLevel.Medium;
18     // Use this for initialization
19     void Start ()
20     {
21     
22         //创建一个识别器
23         m_PhraseRecognizer = new KeywordRecognizer (keywords, m_confidenceLevel);
24         //通过注册监听的方法
25         m_PhraseRecognizer.OnPhraseRecognized += M_PhraseRecognizer_OnPhraseRecognized;
26         //开启识别器
27         m_PhraseRecognizer.Start ();
28     }
29 
30     // 当识别到关键字时,会调用这个方法
31 
32     private void M_PhraseRecognizer_OnPhraseRecognized (PhraseRecognizedEventArgs args)
33     {
34         print (args.text);
35         if (args.text.Equals("小爱"))
36         {
37             SpVoice v = new SpVoice();
38             v.Voice = v.GetVoices(string.Empty, string.Empty).Item(0);
39             v.Speak("我在");
40         }
41 
42         if (args.text.Equals("帮我倒杯水"))
43         {
44             SpVoice v = new SpVoice();
45             v.Voice = v.GetVoices(string.Empty, string.Empty).Item(0);
46             v.Speak("是的主人");
47         }
48 
49         if (args.text.Equals("播放七里香"))
50         {
51             SpVoice v = new SpVoice();
52             v.Voice = v.GetVoices(string.Empty, string.Empty).Item(0);
53             v.Speak("好的,主人,开始播放七里香");
54             gameObject.SetActive(false);
55             xiangdu.SetActive(true);
56             xiangdu.GetComponent<AudioSource>().Play();
57         }
58 
59         if (args.text.Equals("哈哈"))
60         {
61             SpVoice v = new SpVoice();
62             v.Voice = v.GetVoices(string.Empty, string.Empty).Item(0);
63             v.Speak("主人,我没听懂");
64             gameObject.SetActive(false);
65             xiangdu.SetActive(true);
66             xiangdu.GetComponent<AudioSource>().Play();
67         }
68     }
69     private void OnDestroy ()
70     {
71         //用完应该释放,否则会带来额外的开销
72         m_PhraseRecognizer.Dispose ();
73     }
74     // Update is called once per frame
75     void Update ()
76     {
77 
78     }
79 
80     
81 
82 }

 

posted @ 2019-07-11 16:57  Fasty  阅读(2948)  评论(0编辑  收藏  举报