基本信息
源码名称:Unity2018.1.4f开发机器人聊天(语音对聊)
源码大小:22.55M
文件格式:.unitypackage
开发语言:C#
更新时间:2018-10-12
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 3 元×
微信扫码支付:3 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
实现玩家语音输入,机器人语音配文字回答。可成语接龙,算术,查天气,星座,百度科普,聊天等。
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)); } } }