Add File
This commit is contained in:
120
src/main/java/org/dromara/easyai/voice/WaveFile.java
Normal file
120
src/main/java/org/dromara/easyai/voice/WaveFile.java
Normal file
@@ -0,0 +1,120 @@
|
||||
package org.dromara.easyai.voice;
|
||||
|
||||
import javax.sound.sampled.*;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
|
||||
public class WaveFile {
|
||||
public final int NOT_SPECIFIED = AudioSystem.NOT_SPECIFIED; // -1
|
||||
public final int INT_SIZE = 4;
|
||||
|
||||
private int sampleSize = NOT_SPECIFIED;
|
||||
private long framesCount = NOT_SPECIFIED;
|
||||
private int sampleRate = NOT_SPECIFIED;
|
||||
private int channelsNum;
|
||||
private byte[] data; // wav bytes
|
||||
private AudioInputStream ais;
|
||||
private AudioFormat af;
|
||||
|
||||
private Clip clip;
|
||||
private boolean canPlay;
|
||||
|
||||
public WaveFile(File file) throws UnsupportedAudioFileException, IOException {
|
||||
if (!file.exists()) {
|
||||
throw new FileNotFoundException(file.getAbsolutePath());
|
||||
}
|
||||
|
||||
ais = AudioSystem.getAudioInputStream(file);
|
||||
|
||||
af = ais.getFormat();
|
||||
|
||||
framesCount = ais.getFrameLength();
|
||||
|
||||
sampleRate = (int) af.getSampleRate();
|
||||
|
||||
sampleSize = af.getSampleSizeInBits() / 8;
|
||||
|
||||
channelsNum = af.getChannels();
|
||||
|
||||
long dataLength = framesCount * af.getSampleSizeInBits() * af.getChannels() / 8;
|
||||
|
||||
data = new byte[(int) dataLength];
|
||||
ais.read(data);
|
||||
|
||||
AudioInputStream aisForPlay = AudioSystem.getAudioInputStream(file);
|
||||
try {
|
||||
clip = AudioSystem.getClip();
|
||||
clip.open(aisForPlay);
|
||||
clip.setFramePosition(0);
|
||||
canPlay = true;
|
||||
} catch (LineUnavailableException e) {
|
||||
canPlay = false;
|
||||
System.out.println("I can play only 8bit and 16bit music.");
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isCanPlay() {
|
||||
return canPlay;
|
||||
}
|
||||
|
||||
public void play() {
|
||||
clip.start();
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
clip.stop();
|
||||
}
|
||||
|
||||
public AudioFormat getAudioFormat() {
|
||||
return af;
|
||||
}
|
||||
|
||||
public int getSampleSize() {
|
||||
return sampleSize;
|
||||
}
|
||||
|
||||
public float getDurationTime() {
|
||||
return getFramesCount() / getAudioFormat().getFrameRate();
|
||||
}
|
||||
|
||||
public long getFramesCount() {
|
||||
return framesCount;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns sample (amplitude value). Note that in case of stereo samples
|
||||
* go one after another. I.e. 0 - first sample of left channel, 1 - first
|
||||
* sample of the right channel, 2 - second sample of the left channel, 3 -
|
||||
* second sample of the rigth channel, etc.
|
||||
*/
|
||||
public int getSampleInt(int sampleNumber) {
|
||||
|
||||
if (sampleNumber < 0 || sampleNumber >= data.length / sampleSize) {
|
||||
throw new IllegalArgumentException(
|
||||
"sample number can't be < 0 or >= data.length/"
|
||||
+ sampleSize);
|
||||
}
|
||||
|
||||
byte[] sampleBytes = new byte[4]; //4byte = int
|
||||
|
||||
for (int i = 0; i < sampleSize; i++) {
|
||||
sampleBytes[i] = data[sampleNumber * sampleSize * channelsNum + i];
|
||||
}
|
||||
|
||||
int sample = ByteBuffer.wrap(sampleBytes)
|
||||
.order(ByteOrder.LITTLE_ENDIAN).getInt();
|
||||
return sample;
|
||||
}
|
||||
|
||||
public int getSampleRate() {
|
||||
return sampleRate;
|
||||
}
|
||||
|
||||
public Clip getClip() {
|
||||
return clip;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user