Gibt es Bibliotheken, die Audio, wie Telefon, innerem Monolog oder wie ein Mann/eine Frau klingen, Bibliotheken hinzuzuf

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Gibt es Bibliotheken, die Audio, wie Telefon, innerem Monolog oder wie ein Mann/eine Frau klingen, Bibliotheken hinzuzuf

by Anonymous » 06 Mar 2025, 10:51

Ich versuche, verschiedene Audioeffekte anzuwenden, z. B. Audio -Klang wie ein Anruf. Unten ist mein aktueller Ansatz. Wie Sie sehen können, verwende ich mehrere Filter und einfache Algorithmen, um diesen Effekt zu erzielen, aber die Ausgangsqualität ist nicht ideal. Sind diese lebensfähigen Lösungen? Alle anderen Vorschläge wären sehr geschätzt. < /P>

Code: Select all

public static void applySceneEffect(String inputPath, String outputPath, int sceneType) {
LOGGER.info("apply scene effect {} to {}", sceneType, inputPath);

try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputPath);
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputPath, grabber.getAudioChannels())) {

grabber.setOption("vn", "");
grabber.start();

recorder.setAudioCodec(avcodec.AV_CODEC_ID_PCM_S16LE);
recorder.setSampleRate(grabber.getSampleRate());
recorder.setAudioChannels(grabber.getAudioChannels());
recorder.setAudioBitrate(grabber.getAudioBitrate());
recorder.setFormat("wav");

String audioFilter = String.join(",",
"aresample=8000",
"highpass=f=300, lowpass=f=3400",
"acompressor=threshold=-15dB:ratio=4:attack=10:release=100",
"volume=1.5",
"aecho=0.9:0.4:10:0.6"
);

FFmpegFrameFilter f1 = new FFmpegFrameFilter(audioFilter, grabber.getAudioChannels());
f1.setSampleRate(grabber.getSampleRate());
f1.start();

recorder.start();

Random random = new Random();
double noiseLevel = 0.02;

while (true) {
var frame = grabber.grabFrame(true, false, true, true);
if (frame == null) {
break;
}

ShortBuffer audioBuffer = (ShortBuffer) frame.samples[0];
short[] audioData = new short[audioBuffer.remaining()];
audioBuffer.get(audioData);

applyElectricNoise(audioData, grabber.getSampleRate());

audioData = applyDistortion(audioData, 1.5, 30000);

audioBuffer.rewind();
audioBuffer.put(audioData);
audioBuffer.flip();

f1.push(frame);
Frame filteredFrame;
while ((filteredFrame = f1.pull()) != null) {
recorder.record(filteredFrame);
}
}

recorder.stop();
recorder.release();
grabber.stop();
grabber.release();
} catch (FrameGrabber.Exception | FrameRecorder.Exception | FFmpegFrameFilter.Exception e) {
throw new RuntimeException(e);
}
}

private static final double NOISE_LEVEL = 0.005;
private static final int NOISE_FREQUENCY = 60;

public static void applyElectricNoise(short[] audioData, int sampleRate) {
Random random = new Random();

for (int i = 0; i < audioData.length; i++) {
double noise = Math.sin(2 * Math.PI * NOISE_FREQUENCY * i / sampleRate);

double electricNoise = random.nextGaussian() * NOISE_LEVEL * Short.MAX_VALUE + noise;

audioData[i] = (short) Math.max(Math.min(audioData[i] + electricNoise, Short.MAX_VALUE), Short.MIN_VALUE);
}
}

public static short[] applyTremolo(short[] audioData, int sampleRate, double frequency, double depth) {
double phase = 0.0;
double phaseIncrement = 2 * Math.PI * frequency / sampleRate;

for (int i = 0; i < audioData.length; i++) {
double modulator = 1.0 - depth + depth * Math.sin(phase);
audioData[i] = (short) (audioData[i] * modulator);

phase += phaseIncrement;
if (phase > 2 * Math.PI) {
phase -= 2 * Math.PI;
}
}
return audioData;
}

public static short[] applyDistortion(short[] audioData, double gain, double threshold) {
for (int i = 0; i < audioData.length; i++) {
double sample = audioData[i] * gain;

if (sample > threshold) {
sample = threshold;
} else if (sample < -threshold) {
sample = -threshold;
}

audioData[i] = (short) sample;
}
return audioData;
}

Top