Как сгенерировать качественный файл WAVE с помощью Java - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь создать качественный файл WAVE с помощью Java Sound API.

Сначала я использовал следующие значения с 8kHz частотой дискретизации.И качество 128kbps.Но это не генерирует качественный звук.Некоторые слова даже четко не произносятся.

static AudioFormat.Encoding defaultEncoding = AudioFormat.Encoding.PCM_SIGNED;
static float fDefaultSampleRate = 8000;
static int nDefaultSampleSizeInBits = 16;
static int nDefaultChannels = 1;
static int frameSize = 2;
static float frameRate = 8000;
static boolean bDefaultBigEndian = false;

AudioFormat defaultFormat = new AudioFormat(defaultEncoding, fDefaultSampleRate, nDefaultSampleSizeInBits, nDefaultChannels, frameSize, frameRate, bDefaultBigEndian);
AudioInputStream GeneratedAudio = marytts.generateAudio(text); //generate audio from text
AudioInputStream audio = AudioSystem.getAudioInputStream(defaultFormat, GeneratedAudio);
AudioSystem.write(audio, AudioFileFormat.Type.WAVE, new File("FileName.wav"));

Итак, я использовал следующие значения с 44.1kHz частотой дискретизации.Качество также отображается как 705kbps Но проблема в том, что когда я генерирую аудио с этими значениями, генерируемый звук является качественным, но при воспроизведении аудио возникают некоторые шумы, например трещины.

static AudioFormat.Encoding defaultEncoding = AudioFormat.Encoding.PCM_SIGNED;
static float fDefaultSampleRate = 44100;
static int nDefaultSampleSizeInBits = 16;
static int nDefaultChannels = 1;
static int frameSize = 2;
static float frameRate = 44100;
static boolean bDefaultBigEndian = false;

AudioFormat defaultFormat = new AudioFormat(defaultEncoding, fDefaultSampleRate, nDefaultSampleSizeInBits, nDefaultChannels, frameSize, frameRate, bDefaultBigEndian);
AudioInputStream GeneratedAudio = marytts.generateAudio(text); //generate audio from text
AudioInputStream audio = AudioSystem.getAudioInputStream(defaultFormat, GeneratedAudio);
AudioSystem.write(audio, AudioFileFormat.Type.WAVE, new File("FileName.wav"));

Так что мне нужнознаете, как с помощью этого Java sound API генерировать качественный звук без каких-либо потрескавшихся фоновых шумов?Я очень благодарен за любую помощь.Заранее спасибо.

1 Ответ

0 голосов
/ 06 июля 2019

Есть ряд вещей, которые могут привести к потрескиванию: от перегрузки динамиков до переполнения числа битов до чрезмерно больших разрывов в данных.

Для 16-битного кодирования (стандартно для "CD Quality audio") все ваши точки данных PCM должны находиться в диапазоне от -32767 до 32767 (соответствует short) до преобразования значений PCM в байты.

Если они это сделают, то я бы посмотрел далее, чтобы убедиться, что у меня был правильный порядок байтов, и алгоритм, который выдает значения PCM. ИДК, что порекомендовать для тестирования, кроме проверки. Может быть, попробуйте сгенерировать простую синусоидальную волну для разных объемов и посмотреть, соответствуют ли значения PCM ожидаемым, для начала?

16-бит, моно, при 44100 кадр / с должно звучать довольно хорошо. Любой шанс, что вы описываете как треск, может быть формой алиасинга? (Я обычно не думаю об этой форме искажения как о треске.)

...