Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.231.180.210] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Спасибо! Да уж попробую на этой пока сделать...
Почему то подчеркивает вот эту строчку: frames.append(frame); А именно append. Кстати начал получать совсем другие результаты, после ваших советов, попробую сегодня еще записать пару словечек и выложу результаты) |
Сообщ.
#17
,
|
|
|
Провел небольшой тест, все снова плохо...
Раньше я получал вот этот результат для всего: -1 4 -10 6 -1 -1 3 -1 -1 2 -3 0 2 а теперь вот этот получаю: -3 1 -9 8 -5 1 0 -3 1 -1 -1 2 -2 Или вот в таком виде: Какие бы слова не записывал, вот такой результат... -3.4991932068498093 1.9694426457336287 -9.273643571223644 8.99255184947278 -5.435321526906497 1.5855738872936378 0.984217953196569 -3.502277131398279 1.8184110813882457 -1.4623570085484268 -1.1914909785382624 2.6995256102639735 -2.9756843183744692 Вот участок кода, который я обновил: final static int W = 320; // Размер окна, как я понял! [ИЗМЕНЕНИЕ] private static int BITS_IN_BYTE = 8; public static void main(String[] args) { int nnumberofFilters = 24; int nlifteringCoefficient = 22; boolean oisLifteringEnabled = true; boolean oisZeroThCepstralCoefficientCalculated = false; int nnumberOfMFCCParameters = 13; double dsamplingFrequency = 16000.0; // Сделал 16000 [ИЗМЕНЕНИЕ] int nFFTLength = 512; if (oisZeroThCepstralCoefficientCalculated) { // take in account the zero-th MFCC nnumberOfMFCCParameters = nnumberOfMFCCParameters + 1; } else { nnumberOfMFCCParameters = nnumberOfMFCCParameters; } mfcc mfcc = new mfcc(nnumberOfMFCCParameters, dsamplingFrequency, nnumberofFilters, nFFTLength, oisLifteringEnabled, nlifteringCoefficient, oisZeroThCepstralCoefficientCalculated); System.out.println(mfcc.toString()); String PatnToFile = "C:\\test\\hello1." + fileType; File AudioFile = new File(PatnToFile); ByteArrayOutputStream out = new ByteArrayOutputStream(); BufferedInputStream in; try { audioInputStream = AudioSystem.getAudioInputStream(AudioFile); } catch (UnsupportedAudioFileException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } format = audioInputStream.getFormat(); byte[] data = new byte[W * format.getSampleSizeInBits() / BITS_IN_BYTE*2]; double[] inbuf = new double[W/2]; try { in = new BufferedInputStream(new FileInputStream(AudioFile)); int read; while ((read = in.read(data)) > 0) { out.write(data, 0, read); } out.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } data = out.toByteArray(); decode(data, inbuf); inbuf[2] = 10; inbuf[4] = 14; double[] dparameters = mfcc.getParameters(inbuf); System.out.println("MFCC parameters:"); for (int i = 0; i < dparameters.length; i++) { System.out.print(" " + dparameters[i]); } int[] mfccresult = new int[dparameters.length]; for(int i = 0; i < dparameters.length; i++){ mfccresult[i] = (int) dparameters[i]; } for(int i = 0; i < mfccresult.length;i++){ System.out.print(mfccresult[i]); } } Также убрал ДатаЛайн, пока все)) Добавлено Все же надо прямо в программе все делить... Может заменить эту строчку frames.append(frame); На эту надо? Или как... frames.add(frame); Добавлено Выдает ошибку такую кстати: Exception in thread "main" java.lang.ArrayStoreException Ну и с аппендом: The method append(float[]) is undefined for the type ArrayList<float[]> |
Сообщ.
#18
,
|
|
|
Уважаемый MrKor. Чтобы получить совет, нужно поработать самому немного. Руками и мозгом. Не ожидайте, что кто-то будет разгребать кашу в Вашей голове.
Как я уже писал, не нужно выкладывать программу по частям. Части не собираются в полную картину. Доступа на Ваш компьютер у меня нет, в ФСБ я не работаю, мои штатные телепаты в отпуске. Пока вы не выложите программу целиком в полном удобном виде, тяжело Вам подсказать, что у Вас на компьютере происходит. Цитата Выдает ошибку такую кстати: Exception in thread "main" java.lang.ArrayStoreException Если выдаётся ошибка, стоит задуматься о её причинах, попытаться понять, почему ошибка возникает, попробовать исправить ситуацию самому. Обычно такие ошибки легко решаются, если чуть-чуть пошевелить мозгами. Решение таких ошибок - основная часть работы программиста, ей нужно учиться. |
Сообщ.
#19
,
|
|
|
Вот и архивчик:
Прикреплённый файлSoundeD.rar (23,88 Кбайт, скачиваний: 134) Надеюсь так будет лучше, example файл там для тестов... Добавлено Попробовал решить вот так вот: import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.TargetDataLine; import javax.sound.sampled.UnsupportedAudioFileException; public class example { private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE; private static AudioInputStream audioInputStream; private static AudioFormat format; final static int W = 1024; private static int BITS_IN_BYTE = 8; public static void main(String[] args) { String PatnToFile = "C:\\test\\mix20" + "." + fileType; File AudioFile = new File(PatnToFile); ByteArrayOutputStream out = new ByteArrayOutputStream(); BufferedInputStream in; try { audioInputStream = AudioSystem.getAudioInputStream(AudioFile); } catch (UnsupportedAudioFileException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } format = audioInputStream.getFormat(); DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); if (!AudioSystem.isLineSupported(info)) { System.out.println("Error"); } TargetDataLine line = null; try { line = (TargetDataLine) AudioSystem.getLine(info); line.open(format); } catch (LineUnavailableException ex) { System.out.println("Error"); } line.start(); byte[] data = new byte[W * format.getSampleSizeInBits() / BITS_IN_BYTE * 2]; try { in = new BufferedInputStream(new FileInputStream(AudioFile)); int read; while ((read = in.read(data)) > 0) { out.write(data, 0, read); } out.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } data = out.toByteArray(); double[] inbuf = new double[W/2]; decode(data, inbuf); int frame_shift = 320; int frame_size = 410; ArrayList<float[]> frames = new ArrayList<float[]>(); for (int i = 0; i < inbuf.length; i = i + frame_shift) { float[] frame = new float[frame_size]; System.arraycopy(inbuf, i, frame, 0, frame_size); //frames.append(frame); } } public static void decode(byte[] input, double[] output) { assert input.length == 2 * output.length; for (int i = 0; i < output.length; i++) { output[i] = (short) (((0xFF & input[2 * i + 1]) << 8) | (0xFF & input[2 * i])); output[i] /= Short.MAX_VALUE; } } } Все равно вылезает эта чортова ошибка... Добавлено Я думал там был стык байтов с дублями, а оказалось в другом проблемка... |
Сообщ.
#20
,
|
|
|
Почти написал программку делящую файл на равные кусочки) Завтра выложу!
|
Сообщ.
#21
,
|
|
|
ПамПамПам!)
Вот и программка, поддерживает звукозаписи до 2.25 секунд(можно увеличить), что мне как раз подходит, ибо больше мне пока не надо) Файлик прикрепил, завтра попробую соединить все вместе и провести маленькие тесты) Думаю, nsh, вы покруче меня шарите в программной части, поделитесь, пожалуйста! Какие недостатки есть сейчас. Прикреплённый файлexample.java (4,02 Кбайт, скачиваний: 199) Добавлено Её можно улучшить в сотни раз..Чем я и займусь, надо все это сделать автоматом..Чтобы только время можно было вводить, а она тебе массивы отдавала бы)) |
Сообщ.
#22
,
|
|
|
Цитата Прикреплённый файл: SoundeD.rar (23,88 Кбайт, скачиваний: 2) Уже лучше Если Вы прочитаете документацию по ArrayStoreException, Вам станет понятно, что причиной ошибки является попытка поместить элемент в массив несовместимого типа. В Вашем случае Вы пытаетесь скопировать из массива типа byte в массив типа float. ТАк нельзя делать. Сначала нужно преобразовать сигнал в вид float, это Вы уже делали. Потом разбивать на окна. Вы этап преобразования пропустили. Если Eclipse подчеркивает метод add, это означает, что такой метод отсутствует. Нужно поискать похожий метод, для класса ArrayList это append. |
Сообщ.
#23
,
|
|
|
Цитата nsh @ Сначала нужно преобразовать сигнал в вид float, это Вы уже делали. Потом разбивать на окна. Вы этап преобразования пропустили. Аааааа, а я думал сначала разделить, а потом уже делать.Спасибки! Попробую сейчас! |
Сообщ.
#24
,
|
|
|
Попробовал еще раз все сделать, прикрепил в архивчике кодец.
Прикреплённый файлSoundeD.rar (23,66 Кбайт, скачиваний: 124)
Опять ошибка, теперь ошибка java.lang.ArrayIndexOutOfBoundsException, то бишь не существующий элемент массива... УЖ не знаю что там и как, разделял frame_size frame_shift на два, все равно не помогло... Преобразование сделал.Метод add не подчеркивает, а метод append подчеркивает. Кстати, если что у меня Java 6, может быть какие-то проблемы могут и из-за этого возникнуть... Попробую исправить Добавлено Кстати, когда я преобразование сделал, то размер основного массива в 8 раз уменьшился.. Может стоит изменить размеры переменных? ( frame_size frame_shift ) Разделение этих переменных ( 410 и 320) на 8 не помагает.. |
Сообщ.
#25
,
|
|
|
А вот если 256 подставить, как значение двум переменных, то все работает!)
|
Сообщ.
#26
,
|
|
|
Чтобы не возникало выхода за границы в цикле должно быть такое ограничение:
for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) вместо for (int i = 0; i < inbuf.length; i = i + frame_shift) |
Сообщ.
#27
,
|
|
|
Спасибо!
Числа я оставил те же: int frame_size = 410; int frame_shift = 320; Только вот проблемка, если вы смотрели код, то могли видеть, что длина inbuf = 512... После деления на окна у меня создается 1 массив.Так что не знаю...По сути это же тоже самое, что и без этого деления на окна,может ч=стоит где то что то поменять? например, числа..Просто если массив inbuf делать больше, чем 512, то вылезает куча ошибок в MFCC.. |
Сообщ.
#28
,
|
|
|
Цитата могли видеть, что длина inbuf = 512... После деления на окна у меня создается 1 массив.Так что не знаю... Когда декодируете длина полученного результата должна определяться из длины прочитанных данных, а не жёстко задаваться. |
Сообщ.
#29
,
|
|
|
Так тут без задавания - никак, мы же массив создаем:
double[] inbuf = new double[size]; Где size , собс-но, его длинна... Добавлено Хотя, мы же можем поставить длинну такую же, какую имеет начальный массив байт, мы же все потом все равно поделим! Добавлено Уже проверил, кстати, с длинной, как у начального массива, все отлично работает! И деление происходит. |
Сообщ.
#30
,
|
|
|
Вот такие результаты получаю:
| -3.4991926718054214 | 1.9694437093558208 | -9.273642067864989 | 8.992553509896249 | -5.435318907995241 | 1.5855762086177776 | 0.9842192881737314 | -3.502275544221704 | 1.818413705659863 | -1.4623546239919465 | -1.191487821368453 | 2.6995279299149963 | -2.975681484559656 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | -0.6564014681664422 | 0.7802389891166934 | -0.5337068124193423 | -0.06493042991671547 | 0.8677194640315364 | -1.6509748044712116 | 2.19500447203845 | -2.3579418212099754 | 2.1163660589417583 | -1.5606290284132405 | 0.8517246308393844 | -0.16080061139311216 | -0.38363003286907366 Это из одного файла.Что то сбой чую я во втором массиве... Чуть позже выложу код, если необходимо. Добавлено Построил график в каком то гугло сервисе, вот что получилось, примерно: http://imgur.com/Q3uCo6T Небольшие сходства есть, если приглядеться ко второй и третьей части графика... Вот векторы к этому графику: | -3.4991926718054214 | 1.9694437093558208 | -9.273642067864989 | 8.992553509896249 | -5.435318907995241 | 1.5855762086177776 | 0.9842192881737314 | -3.502275544221704|1.818413705659863|-1.462354623991946|-1.19148782136845| 2.6995279299149963 | -2.975681484559656 | 1.5043523440403215 | 2.344562533745208 | 3.0548060948902296 | 3.5893221734407432 | 3.9176900825769265 | 4.027299370480302 | 3.9240151371497727 | 3.6309938207747043 | 3.1858045418955365 | 2.636192420068367 | 2.034962909112171 | 1.4345544043083465 | 0.8818906236179873 | 2.0998034007168607 | 1.492814403340775 | 3.3858159393738045 | 2.8549893292179402 | 1.9577773064511086 | 0.06261290082420551 | -1.2570835235662836 | -1.1431390040840532 | 0.42541655948905943 | 0.45563912379060556 | 1.2673896378430856 | 0.38270850481087354 | - 0.7609497682647048 |