实例介绍
【实例简介】
实现玩家语音输入,机器人语音配文字回答。可成语接龙,算术,查天气,星座,百度科普,聊天等。
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论