Health/Assets/_VoiceAssistant/AIChatTookit/Scripts/Expression/AudioMouthController.cs

46 lines
1.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using System.Collections;
public class AudioMouthController : MonoBehaviour
{
public SkinnedMeshRenderer meshRenderer; // 模型的SkinnedMeshRenderer组件
public int blendShapeIndex; // blendshape索引
public float blendWeightMultiplier = 100f; // blendshape权重倍增器
public float smoothTime = 0.1f; // 平滑过渡时间
[SerializeField]private AudioSource audioSource; // 音频源
private float blendWeight; // blendshape权重
private float blendWeightVelocity; // blendshape权重的速度
void Update()
{
// 如果音频正在播放则平滑设置blendshape的权重
if (audioSource.isPlaying)
{
float amplitude = GetAmplitude();
blendWeight = Mathf.SmoothDamp(blendWeight, amplitude * blendWeightMultiplier, ref blendWeightVelocity, smoothTime);
meshRenderer.SetBlendShapeWeight(blendShapeIndex, blendWeight);
}
else
{
blendWeight = Mathf.SmoothDamp(blendWeight, 0f, ref blendWeightVelocity, smoothTime);
meshRenderer.SetBlendShapeWeight(blendShapeIndex, blendWeight);
}
}
// 获取音频振幅
float GetAmplitude()
{
float[] samples = new float[512];
audioSource.GetOutputData(samples, 0);
float sum = 0f;
for (int i = 0; i < samples.Length; i++)
{
sum += Mathf.Abs(samples[i]);
}
return sum / samples.Length;
}
}