Script that syncronize animation with Decibels (Facial Animations)

Hi! i have a problem this script.

  • using UnityEngine;
    • public class EspressioniScript : MonoBehaviour
  • {
  • public Animator animComp;
  • private enum EspressioniFaccia {TalkB = 1, StopTalk = 0 }
  • public AudioSource audioSource;
  • public float updateStep = 0.1f;
  • public int sampleDataLength = 1024;
  • public float TimeChangeAnim = 2;
    • private float currentUpdateTime = 0f;
    • public float clipLoudness;
  • private float[ ] clipSampleData;
    • private int RandomAnimWord;
  • public int AnimWord;
    • public bool MyFunctionCalled;
    • [Header(“Prossimo Audio Script”)]
    • public AudioSource AudioS;
    • [Header(“Write here the Size Of AudioC”)]
  • public int n;
  • [SerializeField]
  • public AudioClip[ ] AudioC;
    • public bool MyFunctionCalled2;
    • public int NumeroAudio = 0;
    • void Start()
  • {
  • clipSampleData = new float[sampleDataLength];
    • FirstAudio();
  • }
        • // Update is called once per frame
  • void Update()
  • {
  • currentUpdateTime += Time.deltaTime;
  • if (currentUpdateTime >= updateStep)
  • {
  • currentUpdateTime = 0f;
  • float[ ] samples = new float[audioSource.clip.samples * audioSource.clip.channels];
  • audioSource.clip.GetData(clipSampleData, audioSource.timeSamples);
  • clipLoudness = 0f;
  • foreach (var sample in clipSampleData)
  • {
  • clipLoudness += Mathf.Abs(sample);
  • }
  • clipLoudness /= sampleDataLength;
  • }
  • {
  • if (clipLoudness > 0.025)
  • {
  • animComp.SetInteger(“EspressioniFaccia”, AnimWord);
  • }
  • if (clipLoudness < 0.025 && clipLoudness != 0)
  • {
  • animComp.SetInteger(“EspressioniFaccia”, 0);
  • {
  • if (MyFunctionCalled == false)
  • {
  • RandomAnim();
  • MyFunctionCalled = true;
  • }
  • }
    • }
  • if (clipLoudness == 0)
  • {
  • animComp.SetInteger(“EspressioniFaccia”, 0);
  • StopRandomAnim();
  • }
  • }
  • // Update Prossimo Audio
  • if (NumeroAudio >= n + 1)
  • {
  • ResetAudio();
  • }
    • if (!AudioS.isPlaying && NumeroAudio <= n && MyFunctionCalled2 == false)
  • {
  • MyFunctionCalled2 = true;
  • NextAudio();
  • }
  • }
    • void RandomAnim()
  • {
  • int RandomAnimWord = Random.Range(1, 4);
  • AnimWord = RandomAnimWord;
  • Invoke(“RandomAnim”, TimeChangeAnim);
    • }
  • void StopRandomAnim()
  • {
  • MyFunctionCalled = false;
  • CancelInvoke(“RandomAnim”);
  • }
  • //Script Audio
  • void NextAudio()
  • {
  • MyFunctionCalled2 = false;
  • NumeroAudio += 1;
  • AudioS.clip = AudioC[NumeroAudio];
  • AudioS.Play();
  • }
  • void FirstAudio()
  • {
  • MyFunctionCalled2 = false;
  • NumeroAudio = 0;
  • AudioS.clip = AudioC[NumeroAudio];
  • AudioS.Play();
  • }
  • void ResetAudio()
  • {
  • NumeroAudio = 0;
  • AudioS.clip = AudioC[NumeroAudio];
  • AudioS.Play();
  • }
      • }

This script syncronize an animation controlled by an animator with the Decibels of an audioclip (the character talk when there are Decibels). i get this two errors:

-1- C:\buildslave\unity\build\Modules/Audio/Public/sound/SoundManager.cpp(519) : Error executing result = instance->m_Sound->lock(offsetBytes, lengthBytes, &ptr1, &ptr2, &len1, &len2) (An invalid parameter was passed to this function. ) UnityEngine.AudioClip:GetData() EspressioniScript:Update() (at Assets/Livelli/Dettagli Personaggi/Espressioni Script/EspressioniScript.cs:53)

-2- IndexOutOfRangeException: Index was outside the bounds of the array. EspressioniScript.NextAudio () (at Assets/Livelli/Dettagli Personaggi/Espressioni Script/EspressioniScript.cs:114) EspressioniScript.Update () (at Assets/Livelli/Dettagli Personaggi/Espressioni Script/EspressioniScript.cs:93)

– Someone Can help me? thanks!

https://discussions.unity.com/t/481379