Files
plugin-library/Assets/Main/Script/Runtime/LasterDoMain/DigitalHumanVoiceSystem.cs
2025-05-23 18:26:47 +08:00

87 lines
3.2 KiB
C#

using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using Main;
using Stary.Evo;
using Stary.Evo.UIFarme;
using UnityEngine;
using YooAsset;
namespace Main
{
public interface IDigitalHumanVoiceSystem : ISystem
{
UniTask PlayVoice(string auid, Action callback = null);
UniTask PlayTest(string auid, Action callback = null);
void PlayImage(string uiid);
}
public class DigitalHumanVoiceSystem : AbstractSystem, IDigitalHumanVoiceSystem
{
private CancellationTokenSource tokenSource;
public async UniTask PlayVoice(string auid, Action callback = null)
{
DisposeTokenSource();
tokenSource = new CancellationTokenSource();
var info = this.GetData<IAudioTableData>().GetAudioToUIInfo(auid);
var handle1 = YooAssets.LoadAssetAsync<AudioClip>(info.audioFileName);
await handle1.WithCancellation(tokenSource.Token);
AudioClip audioClip = handle1.GetAssetObject<AudioClip>();
var handle2 = YooAssets.LoadAssetAsync<Sprite>(info.UIMessageInfo.filename);
await handle2.WithCancellation(tokenSource.Token);
Sprite sprite = handle2.GetAssetObject<Sprite>();
MainArchitecture.Interface.GetSystem<IDigitalHuman>().SetTalkState(audioClip, sprite);
await UniTask.Delay(TimeSpan.FromSeconds(audioClip.length+1f), cancellationToken: tokenSource.Token);
callback?.Invoke();
}
public async UniTask PlayTest(string auid, Action callback = null)
{
DisposeTokenSource();
tokenSource = new CancellationTokenSource();
var info = this.GetData<IAudioTableData>().GetAudioToUIInfo(auid);
var handle1 = YooAssets.LoadAssetAsync<AudioClip>(info.audioFileName);
await handle1.WithCancellation(tokenSource.Token);
AudioClip audioClip = handle1.GetAssetObject<AudioClip>();
MainArchitecture.Interface.GetSystem<IDigitalHuman>().SetTalkState(audioClip, info.UIMessageInfo.subtitle);
await UniTask.Delay(TimeSpan.FromSeconds(audioClip.length), cancellationToken: tokenSource.Token);
callback?.Invoke();
}
public async void PlayImage(string uiid)
{
DisposeTokenSource();
tokenSource = new CancellationTokenSource();
var info =this.GetData<IAudioTableData>().GetUIInfo(uiid);
var handle1 = YooAssets.LoadAssetAsync<Sprite>(info.filename);
await handle1.WithCancellation(tokenSource.Token);
Sprite sprite = handle1.GetAssetObject<Sprite>();
MainArchitecture.Interface.GetSystem<IDigitalHuman>().SetTalkState( sprite);
}
protected override void OnInit()
{
}
private void DisposeTokenSource()
{
if (tokenSource != null && !tokenSource.IsCancellationRequested)
{
tokenSource.Cancel();
tokenSource.Dispose();
tokenSource = null;
}
}
public override void Dispose()
{
DisposeTokenSource();
}
}
}