Давайте предположим, что у меня есть звуковой файл WAV с предложением:Если извлеченный аудио-образец должен содержаться внутри исходного источника при сравнении байтов?
+-----------+----------------------------------------+
| meta data | 'Audio recognition sometimes is trick' |.wav
+-----------+----------------------------------------+
Теперь рассмотрим открытие этого звука в Audacity и извлечение и сохранение слово «иногда» в другом файле на основе его волнового дро.
+-----------+-------------+
| meta data | 'sometimes' |.wav
+-----------+-------------+
Затем я использовал этот Java код, чтобы получить звуковые данные только из двух файлов:
//...
Path source = Paths.get("source.wav");
Path sample = Paths.get("sometimes.wav");
int index = compare(transform(source), transform(sample));
System.out.println("Shouldn't I be greater than -1!? " + (index > -1));
//...
private int compare(int[] source, int[] sample) throws IOException {
return Collections.indexOfSubList(Arrays.asList(source), Arrays.asList(sample));
}
private int[] transform(Path audio) throws IOException, UnsupportedAudioFileException {
try (AudioInputStream ais = AudioSystem.getAudioInputStream(
new ByteArrayInputStream(Files.readAllBytes(audio)))) {
AudioFormat format = ais.getFormat();
byte[] audioBytes = new byte[(int) (ais.getFrameLength() * format.getFrameSize())];
int nlengthInSamples = audioBytes.length/2;
int[] audioData = new int[nlengthInSamples];
for (int i = 0; i < nlengthInSamples; i++) {
int LSB = audioBytes[2*i]; /* First byte is LSB (low order) */
int MSB = audioBytes[2*i+1]; /* Second byte is MSB (high order) */
audioData[i] = (MSB << 8) | (255 & LSB);
}
return audioData;
}
}
Сейчас идет мой вопрос снова.
Не должен ли этот код находить байты аудиоданных иногда в исходном звуковом файле с учетом упомянутого ранее извлечения?
Я пытался сравнивать содержимое в виде строки, но не повезло вообще:
new String(source).contains(new String(sample));
Может кто-то момент, что я здесь отсутствует?
Являются ли эти несжатые (PCM) WAV? Кроме того, каков размер фрейма в двух файлах? – NPE
Я смущен методом чтения аудиофайлов. Почему бы не использовать «AudioInputStream ais = AudioSystem.getAudioInputStream (url)»; Предполагается, что вы передаете URL-адрес файла вместо Path, который должен работать независимо от того, находится ли ресурс в банке или вне программы. Затем проверьте сравнение массивов byte [] перед тестированием после декодирования в PCM. Это мое предложение, что я сделал бы в качестве первого шага к решению вопроса. Если исходный файл и клип Audacity не совпадают с форматом, получившийся PCM, несомненно, будет отличаться, даже если звучит одинаково. –
@Phil. На самом деле ваше первое предложение упрощает некоторые строки, спасибо. Но даже сравнивая байты без преобразования, я не могу найти образец внутри исходного аудиофайла. Учитывая, что я извлек образец из источника с помощью Audacity, предполагается, что будет сохранено количество каналов, скорость и т. Д., Правильно? Тем не менее, вот то, что AudioFormat, полученный от AudioInputStream, показывает: PCM_SIGNED 22050.0 Гц, 16 бит, моно, 2 байта/фрейм, little-endian PCM_SIGNED 22050.0 Гц, 16 бит, моно, 2 байта/кадр, малоконечный – zeh