using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class CarAssistant : MonoBehaviour
{
public StatusManager statusManager;
public RobotAnimControl animController;
///
/// 播放声音
///
public AudioSource audioSource;
///
/// 聊天配置
///
public ChatSetting chatSettings;
///
/// 语音输入处理类
///
public AudioRecorder voiceInputs;
[System.NonSerialized]
public AudioClip clip;
public VoiceWakeUp voiceWakeUp;
//保存聊天记录
public List chatHistory;
public TextMeshPro textMeshPro;
public string currentTalking = "";
///
/// 启用语音唤醒
///
public bool EnableVoiceWakeup
{
get
{
return _EnableVoiceWakeup;
}
set
{
_EnableVoiceWakeup = value;
if(value && voiceWakeUp.recgnizeStatus == VoiceWakeUp.RecgnizeStatus.Idle)
{
voiceWakeUp.StartRecgnition(OnRecgnizedKeyWord);
}
else if(!value &&voiceWakeUp.recgnizeStatus == VoiceWakeUp.RecgnizeStatus.Recgnizing)
{
voiceWakeUp.StopRecognition();
}
}
}
bool _EnableVoiceWakeup = false;
public event Action onReceiveText;
private void Awake()
{
statusManager = new StatusManager(this);
}
private IEnumerator Start()
{
while (!voiceWakeUp.IsEnable)
{
yield return null;
}
statusManager.MakeTransition(statusManager.idle);
voiceInputs.onRecordOver += AcceptClip;
}
private void Update()
{
statusManager.Update();
}
///
/// 当识别到语音
///
///
void OnRecgnizedKeyWord(bool successed)
{
if (successed)
{
statusManager.MakeTransition(statusManager.listening);
}
}
///
/// 处理录制的音频数据
///
///
public void AcceptClip(AudioClip _audioClip,AudioRecorder.StopReason stopReason)
{
if (chatSettings.m_SpeechToText == null)
return;
if(stopReason == AudioRecorder.StopReason.WaitTimeOut)
{
TalkingPreset(TTS.PresetAudio.SorrySaid);
return;
}
if (_audioClip == null)
return;
//切换思考动作
statusManager.MakeTransition(statusManager.thinking);
chatSettings.m_SpeechToText.SpeechToText(_audioClip, DealingTextCallback);
}
public void PlayAudioClip(AudioClip clip)
{
audioSource.clip = clip;
audioSource.Play();
}
///
/// 处理识别到的文本
///
///
private void DealingTextCallback(string _postWord)
{
if (_postWord.Equals(""))
{
TalkingPreset(TTS.PresetAudio.SorrySaid);
return;
}
//添加记录聊天
chatHistory.Add(_postWord);
if (onReceiveText != null)
onReceiveText(_postWord);
//提示词
string _msg = _postWord;
Debug.Log("玩家说:" + _postWord);
//发送数据
chatSettings.m_ChatModel.PostMsg(_msg, Talking);
}
void TalkingPreset(TTS.PresetAudio presetAudio)
{
Debug.Log("播放预置的声音:" + presetAudio);
chatSettings.m_TextToSpeech.Speak(presetAudio, (clip) => {
this.clip = clip;
statusManager.MakeTransition(statusManager.talking);
});
}
///
/// 说话,但不加进历史记录
///
///
void TalkingDontAddToHistory(string _response)
{
_response = _response.Trim();
currentTalking = _response;
Debug.Log("收到AI回复:" + _response);
chatSettings.m_TextToSpeech.Speak(_response, (clip) => {
this.clip = clip;
statusManager.MakeTransition(statusManager.talking);
});
}
///
/// AI回复的信息的回调
///
///
void Talking(string _response)
{
_response = _response.Trim();
currentTalking = _response;
Debug.Log("收到AI回复:" + _response);
//记录聊天
chatHistory.Add(_response);
chatSettings.m_TextToSpeech.Speak(_response, (clip) => {
this.clip = clip;
statusManager.MakeTransition(statusManager.talking);
});
}
}