using NAudio.Wave; using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; public class AudioPlayer : MonoBehaviour { public AudioSource PlayVoiceChanger(AudioClip clip) { // 将AudioClip数据转换为PCM格式 byte[] audioData = ConvertAudioClipToPCM(clip); // 创建一个内存流来存储音频数据 MemoryStream audioStream = new MemoryStream(audioData); // 创建一个WaveStream对象来读取音频数据 WaveStream waveStream = new RawSourceWaveStream(audioStream, new WaveFormat()); // 创建一个用于播放音频的Unity AudioSource组件 AudioSource audioSource = gameObject.AddComponent(); // 创建一个NAudio的WaveProvider来包装WaveStream对象 WaveChannel32 waveProvider = new WaveChannel32(waveStream); // 实例化变声效果 // 在这里可以使用任何你想要的变声效果类 // 将变声后的音频数据传递给AudioSource组件 audioSource.clip = AudioClip.Create("Voice Changer Audio", (int)waveProvider.Length, waveProvider.WaveFormat.Channels, waveProvider.WaveFormat.SampleRate, false); byte[] audioBytes = new byte[waveProvider.Length]; waveProvider.Read(audioBytes, 0, audioBytes.Length); float[] audioSamples = new float[audioBytes.Length / 2]; for (int i = 0, j = 0; i < audioBytes.Length; i += 2, j++) { short sample = (short)((audioBytes[i + 1] << 8) | audioBytes[i]); audioSamples[j] = sample / 32768f; } audioSource.clip.SetData(audioSamples, 0); // 播放音频 audioSource.Play(); return audioSource; } // 将AudioClip数据转换为PCM格式 private byte[] ConvertAudioClipToPCM(AudioClip clip) { float[] samples = new float[clip.samples * clip.channels]; clip.GetData(samples, 0); byte[] audioData = new byte[samples.Length * 2]; int audioDataIndex = 0; for (int i = 0; i < samples.Length; i++) { short sample = (short)(samples[i] * 32767); byte[] sampleBytes = BitConverter.GetBytes(sample); audioData[audioDataIndex++] = sampleBytes[0]; audioData[audioDataIndex++] = sampleBytes[1]; } return audioData; } }