ict.xunfei/Assets/Scripts/kdl/AudioPlayer.cs

69 lines
2.2 KiB
C#

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<AudioSource>();
// 创建一个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;
}
}