在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#游戏开发 → Unity2018.1.4f开发机器人聊天(语音对聊)

Unity2018.1.4f开发机器人聊天(语音对聊)

C#游戏开发

下载此实例
  • 开发语言:C#
  • 实例大小:22.55M
  • 下载次数:83
  • 浏览次数:1587
  • 发布时间:2018-10-12
  • 实例类别:C#游戏开发
  • 发 布 人:jojo1024
  • 文件格式:.unitypackage
  • 所需积分:3
 相关标签: 聊天 语音 unity 机器人 开发

实例介绍

【实例简介】

实现玩家语音输入,机器人语音配文字回答。可成语接龙,算术,查天气,星座,百度科普,聊天等。

【实例截图】

【核心代码】

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using HuiHut.Turing;
using HuiHut.IFlyVoice;

namespace HuiHut.Facemoji
{
    /// <summary>
    /// 聊天机器人:
    /// </summary>
    [AddComponentMenu("Facemoji/FacemojiAI")]
    //[RequireComponent(typeof(WebCamTextureToMatHelper))]
    public class FacemojiAI : MonoBehaviour
    {
        /// <summary>
        /// 机器人回复消息、录制消息在界面上的显示Label
        /// </summary>
        public GameObject testMessageLabel;

        /// <summary>
        /// 用户消息的输入框
        /// </summary>
        public InputField userMessageInputField;

        /// <summary>
        /// testMessageLabel的文本内容
        /// </summary>
        public static Text testMessageText;

        /// <summary>
        /// 机器人
        /// </summary>
        private static TuringRobot turingRobot = new TuringRobot();

        /// <summary>
        /// 机器人API Key
        /// </summary>
        private string API_Key = @"2ee6e84a755b4ac2b5b2cc25d992b03a";

        /// <summary>
        /// 随机生成用户ID,用于关联上下文语境
        /// </summary>
        private string userID = new System.Random().Next(0, int.MaxValue).ToString();
        
        /// <summary>
        /// 用户输入消息
        /// </summary>
        private static string userMessage = string.Empty;

        /// <summary>
        /// 机器人回复的消息
        /// </summary>
        private static string robotMessage = string.Empty;

        /// <summary>
        /// 机器人返回链接列表
        /// </summary>
        private static List<string> robotLinks = new List<string>();
        
        // Use this for initialization
        void Start()
        {
            // 设置信息标签(messageLabel)位于屏幕偏下位置
           // testMessageLabel.transform.Translate(new Vector3(0, - 2 * Screen.height / 3   50, 0));

            testMessageText = testMessageLabel.GetComponent<Text>();
            
            // 使用设备唯一标识
            userID = SystemInfo.deviceUniqueIdentifier;

            // 初始化机器人
            turingRobot.initRobot(API_Key, userID);
            
        }

        // Update is called once per frame
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Escape))
            {
#if UNITY_5_3 || UNITY_5_3_OR_NEWER
              //  SceneManager.LoadScene("FacemojiStart");
#else
                Application.LoadLevel("FacemojiStart");
#endif
            }
        }

        // 发送消息给机器人
        public static void SendToRobot(string userMessage)
        {
            if(!userMessage.Equals(""))
            {
                // 用户消息传入机器人,获取机器人回复信息、回复链接
                turingRobot.Chat(userMessage, ref robotMessage, ref robotLinks);

                //正常的返回结果
                if (robotLinks.Count == 0)  // 机器人回复的消息无链接
                {
                    // 把信息显示在测试的text中
                    testMessageText.text = robotMessage;
                }
                else  // 机器人回复的消息有链接
                {
                    // 把信息显示在测试的text中
                    testMessageText.text = robotMessage;
                    foreach (string Link in robotLinks)
                        testMessageText.text  = ("\n"   Link);
                }

                if(!string.IsNullOrEmpty(Menu.speakerLanguageSelected))
                {
                    // 朗读机器人回复的消息
                    IFlyVoice.IFlyVoice.startSpeaking(robotMessage, Menu.speakerLanguageSelected);
                }
                else
                {
                    Debug.Log("Please choose a speaker!");
                }
            }
            else
            {
                Debug.Log("The message sent is empty!");
            }
        }


        public void OnUserMessageSendButton()
        {
            // 获取用户输入的内容
            userMessage = userMessageInputField.text;

            // 清空输入框
            userMessageInputField.text = string.Empty;

            // 发送消息给机器人
            SendToRobot(userMessage);
        }

        public void OnSpeakButton()
        {

            showAsToast("OnSpeakButton");
            if (!string.IsNullOrEmpty(Menu.userLanguageSelected))
            {
                showAsToast("OnSpeakButton:"  Menu.userLanguageSelected);
                // 语音识别,识别后自动发送消息给机器人
                IFlyVoice.IFlyVoice.startRecognize(Menu.userLanguageSelected);
            }
            else
            {
                Debug.Log("Please choose your language!");
            }
        }
        /// <summary>
        /// Show String as Toast.
        /// </summary>
        /// <param name="text">Text.</param>
        /// <param name="activity">Activity.</param>
        public static void showAsToast(string text, AndroidJavaObject activity = null)
        {
            Debug.Log(text);
            if (activity == null)
            {
                AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            }
            AndroidJavaClass Toast = new AndroidJavaClass("android.widget.Toast");
            AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
            activity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
                AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", text);
                Toast.CallStatic<AndroidJavaObject>("makeText", context, javaString, Toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
            }
            ));
        }


        public void OnBackButton()
        {
#if UNITY_5_3 || UNITY_5_3_OR_NEWER
            SceneManager.LoadScene("Start");
#else
            Application.LoadLevel("Start");
#endif
        }

    }
}
语音合成
using System.Threading;
using UnityEngine;

namespace Test.IFlyVoice
{
    public class IFlyVoice
    {
        // Your IFly AppID
        const string AppID = "ID";

        //---------------------------------------
        const string SpeechConstant_PARAMS = "params";
        const string SpeechConstant_ENGINE_TYPE = "engine_type";
        const string SpeechConstant_TYPE_CLOUD = "cloud";
        const string SpeechConstant_VOICE_NAME = "voice_name";
        const string SpeechConstant_SPEED = "speed";
        const string SpeechConstant_PITCH = "pitch";
        const string SpeechConstant_VOLUME = "volume";
        const string SpeechConstant_STREAM_TYPE = "stream_type";
        const string SpeechConstant_KEY_REQUEST_FOCUS = "request_audio_focus";
        const string SpeechConstant_AUDIO_FORMAT = "audio_format";
        const string SpeechConstant_TTS_AUDIO_PATH = "tts_audio_path";
        const string SpeechConstant_RESULT_TYPE = "result_type";
        const string SpeechConstant_LANGUAGE = "language";
        const string SpeechConstant_ACCENT = "accent";
        const string SpeechConstant_VAD_BOS = "vad_bos";
        const string SpeechConstant_VAD_EOS = "vad_eos";
        const string SpeechConstant_ASR_PTT = "asr_ptt";
        const string SpeechConstant_ASR_AUDIO_PATH = "asr_audio_path";
        //---------------------------------------

        //AndroidJavaClass
        private static AndroidJavaClass UnityPlayer;
        private static AndroidJavaObject currentActivity;
        private static AndroidJavaClass SpeechSynthesizer;
        private static AndroidJavaClass SpeechRecognizer;

        //AndroidJavaObject
        private static AndroidJavaObject mTts;
        private static AndroidJavaObject mIat;

        private static XfInitListener mInitListener;
        private static XfSynthesizerListener mTtsListener;
        public static XfRecognizerListener mRecognizerListener;

        //to judge if the program has execute initFlyVoice before speak or recognize
        private static bool inited = false;

        private static void initIFlyVoice()
        {
#if UNITY_ANDROID
            //Initialize AndroidJavaClass(Please do not delete the commended codes for that those code are for test and check)
            Debug.Log("语音");
            UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

            string param = "appid="   AppID   ",engine_mode=msc";
            Debug.Log(param);
            AndroidJavaClass SpeechUtility = new AndroidJavaClass("com.iflytek.cloud.SpeechUtility");

            SpeechUtility.CallStatic<AndroidJavaObject>("createUtility",
                    currentActivity.Call<AndroidJavaObject>("getApplicationContext"),
                    new AndroidJavaObject("java.lang.String", param)
            );

            //Init Listeners
            mInitListener = new XfInitListener();
            mTtsListener = new XfSynthesizerListener();
            mRecognizerListener = new XfRecognizerListener();
            Debug.Log("Init Listeners");
            //Init mTts and mIat
            if (mInitListener != null)
            {
                SpeechSynthesizer = new AndroidJavaClass("com.iflytek.cloud.SpeechSynthesizer");
                SpeechRecognizer = new AndroidJavaClass("com.iflytek.cloud.SpeechRecognizer");

                mTts = SpeechSynthesizer.CallStatic<AndroidJavaObject>("createSynthesizer", currentActivity, mInitListener);
                mIat = SpeechRecognizer.CallStatic<AndroidJavaObject>("createRecognizer", currentActivity, mInitListener);
                Debug.Log(mIat);
            }
            inited = true;
#endif
        }

        public static void startSpeaking(string text, string voicer = "xiaoyan")
        {
            Debug.Log("机器人说话");
            if (!inited)
            {
                initIFlyVoice();
            }
            setTtsParam(voicer);
            int code = mTts.Call<int>("startSpeaking", text, mTtsListener);
            if (code != 0)
            {
                Debug.LogError("SpeakFailed,ErrorCode"   code);
            }
        }

        public static void startRecognize(string language = "mandarin")
        {
            Debug.Log("录音开始");
            if (!inited)
            {
                initIFlyVoice();
            }
            setIatParam(language);//设置识别参数及语种
            int ret = mIat.Call<int>("startListening", mRecognizerListener);
            int time = 0;
            showAsToast("speaking:" ret);
            while (!mRecognizerListener.isEnd &&time<5000)
            {
                Thread.Sleep(500);
                time  = 500;
                showAsToast("speaking_time:"   time);
            }
            Debug.Log(ret);
            if (ret != 0)
            {
                Debug.LogError("听写失败,错误码:"   ret);
            }
            else
            {
                Debug.LogError("Please start talking.");
                showAsToast("Please start talking.",currentActivity);
            }
        }

        /// <summary>
        /// Show String as Toast.
        /// </summary>
        /// <param name="text">Text.</param>
        /// <param name="activity">Activity.</param>
        public static void showAsToast( string text, AndroidJavaObject activity = null)
        {
            Debug.Log(text);
            if (activity == null)
            {
                AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            }
            AndroidJavaClass Toast = new AndroidJavaClass("android.widget.Toast");
            AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
            activity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
                AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", text);
                Toast.CallStatic<AndroidJavaObject>("makeText", context, javaString, Toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
            }
            ));
        }


        private static void setTtsParam(string voicer)
        {
            Debug.Log("语音合成相关设置");
            if (mTts == null)
            {
                Debug.LogError("mTts=null");
                return;
            }
            //清空参数
            mTts.Call<bool>("setParameter", SpeechConstant_PARAMS, null);

            //设置合成
            //设置使用云端引擎
            mTts.Call<bool>("setParameter", SpeechConstant_ENGINE_TYPE, SpeechConstant_TYPE_CLOUD);

            //设置发音人
            mTts.Call<bool>("setParameter", SpeechConstant_VOICE_NAME, voicer);
            //设置合成语速
            mTts.Call<bool>("setParameter", SpeechConstant_SPEED, "50");
            //设置合成音调
            mTts.Call<bool>("setParameter", SpeechConstant_PITCH, "50");
            //设置合成音量
            mTts.Call<bool>("setParameter", SpeechConstant_VOLUME, "50");
            //设置播放器音频流类型
            mTts.Call<bool>("setParameter", SpeechConstant_STREAM_TYPE, "3");

            // 设置播放合成音频打断音乐播放,默认为true
            mTts.Call<bool>("setParameter", SpeechConstant_KEY_REQUEST_FOCUS, "true");

            // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
            // 注:AUDIO_FORMAT参数语记需要更新版本才能生效
            mTts.Call<bool>("setParameter", SpeechConstant_AUDIO_FORMAT, "wav");

            AndroidJavaClass Environment = new AndroidJavaClass("android.os.Environment");
            AndroidJavaObject rootDir = Environment.CallStatic<AndroidJavaObject>("getExternalStorageDirectory").Call<AndroidJavaObject>("toString");
            rootDir = rootDir.Call<AndroidJavaObject>("concat", "/msc/tts.wav");

            mTts.Call<bool>("setParameter", SpeechConstant_TTS_AUDIO_PATH, rootDir);
        }

        private static void setIatParam(string lag)
        {
            Debug.Log("录音语言相关设置");
            // 清空参数
            mIat.Call<bool>("setParameter", SpeechConstant_PARAMS, null);
            // 设置引擎
            mIat.Call<bool>("setParameter", SpeechConstant_ENGINE_TYPE, SpeechConstant_TYPE_CLOUD);
            // 设置返回结果格式
            mIat.Call<bool>("setParameter", SpeechConstant_RESULT_TYPE, "json");
            Debug.Log(lag "语言" lag.Equals("en_us"));
            if (lag.Equals("en_us"))
            {
                // 设置语言
                mIat.Call<bool>("setParameter", SpeechConstant_LANGUAGE, "en_us");
            }
            else
            {
                // 设置语言
                mIat.Call<bool>("setParameter", SpeechConstant_LANGUAGE, "zh_cn");
                // 设置语言区域
                mIat.Call<bool>("setParameter", SpeechConstant_ACCENT, lag);
            }
            Debug.Log("设置完成");
            // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
            mIat.Call<bool>("setParameter", SpeechConstant_VAD_BOS, "4000");
            Debug.Log("语音前端点");
            // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
            mIat.Call<bool>("setParameter", SpeechConstant_VAD_EOS, "1000");
            Debug.Log("语音后端点");
            // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
            mIat.Call<bool>("setParameter", SpeechConstant_ASR_PTT, "1");
          

            // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
            // 注:AUDIO_FORMAT参数语记需要更新版本才能生效
            mIat.Call<bool>("setParameter", SpeechConstant_AUDIO_FORMAT, "wav");
            Debug.Log("保存与否"  SpeechConstant_AUDIO_FORMAT);
            AndroidJavaClass Environment = new AndroidJavaClass("android.os.Environment");
            AndroidJavaObject rootDir = Environment.CallStatic<AndroidJavaObject>("getExternalStorageDirectory").Call<AndroidJavaObject>("toString");
            rootDir = rootDir.Call<AndroidJavaObject>("concat", "/msc/iat.wav");
            mIat.Call<bool>("setParameter", SpeechConstant_ASR_AUDIO_PATH, rootDir);
            Debug.Log("语音路径完成"  SpeechConstant_ASR_AUDIO_PATH "___"  rootDir);
            Debug.Log(mIat.Call<bool>("setParameter", SpeechConstant_ASR_AUDIO_PATH, rootDir));
        }
    }
}

实例下载地址

Unity2018.1.4f开发机器人聊天(语音对聊)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警