Add AudioRecorder
This commit is contained in:
parent
4f877d3d5b
commit
7d15285da5
68
src/main/java/envoy/client/data/AudioRecorder.java
Normal file
68
src/main/java/envoy/client/data/AudioRecorder.java
Normal file
@ -0,0 +1,68 @@
|
||||
package envoy.client.data;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
import javax.sound.sampled.*;
|
||||
|
||||
import envoy.exception.EnvoyException;
|
||||
|
||||
/**
|
||||
* Records audio and exports it as a byte array.
|
||||
* <p>
|
||||
* Project: <strong>envoy-client</strong><br>
|
||||
* File: <strong>AudioRecorder.java</strong><br>
|
||||
* Created: <strong>02.07.2020</strong><br>
|
||||
*
|
||||
* @author Kai S. K. Engelbart
|
||||
* @since Envoy Client v0.1-beta
|
||||
*/
|
||||
public final class AudioRecorder {
|
||||
|
||||
private final AudioFormat format;
|
||||
|
||||
private DataLine.Info info;
|
||||
private TargetDataLine line;
|
||||
private Path tempFile;
|
||||
|
||||
public AudioRecorder() { this(new AudioFormat(16000, 16, 1, true, false)); }
|
||||
|
||||
public AudioRecorder(AudioFormat format) {
|
||||
this.format = format;
|
||||
info = new DataLine.Info(TargetDataLine.class, format);
|
||||
}
|
||||
|
||||
public boolean isSupported() { return AudioSystem.isLineSupported(info); }
|
||||
|
||||
public void start() throws EnvoyException {
|
||||
try {
|
||||
|
||||
// Open the line
|
||||
line = (TargetDataLine) AudioSystem.getLine(info);
|
||||
line.open(format);
|
||||
line.start();
|
||||
|
||||
// Prepare temp file
|
||||
tempFile = Files.createTempFile("recording", "wav");
|
||||
|
||||
// Start the recording
|
||||
var ais = new AudioInputStream(line);
|
||||
AudioSystem.write(ais, AudioFileFormat.Type.WAVE, tempFile.toFile());
|
||||
} catch (IOException | LineUnavailableException e) {
|
||||
throw new EnvoyException("Cannot record voice", e);
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] finish() throws EnvoyException {
|
||||
try {
|
||||
line.stop();
|
||||
line.close();
|
||||
byte[] data = Files.readAllBytes(tempFile);
|
||||
Files.delete(tempFile);
|
||||
return data;
|
||||
} catch (IOException e) {
|
||||
throw new EnvoyException("Cannot save voice recording", e);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user