实例介绍
【实例简介】
实现玩家语音输入,机器人语音配文字回答。可成语接龙,算术,查天气,星座,百度科普,聊天等。
【实例截图】
【核心代码】
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)); } } }
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论