69 lines
2.2 KiB
C#
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;
|
|
}
|
|
}
|