На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
Модераторы: RaD, nsh
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Проблема сравнительного анализа MFCC векторов! , Небольшая проблемка..
    Спасибо! Да уж попробую на этой пока сделать...

    Почему то подчеркивает вот эту строчку: frames.append(frame); А именно append. Кстати начал получать совсем другие результаты, после ваших советов, попробую сегодня еще записать пару словечек и выложу результаты)
      Провел небольшой тест, все снова плохо...

      Раньше я получал вот этот результат для всего:

      ExpandedWrap disabled
          -1   4   -10   6   -1   -1   3   -1   -1   2   -3   0   2



      а теперь вот этот получаю:

      ExpandedWrap disabled
          -3   1   -9   8   -5   1   0   -3   1   -1   -1   2   -2


      Или вот в таком виде:
      Какие бы слова не записывал, вот такой результат...
      ExpandedWrap disabled
        -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


      Вот участок кода, который я обновил:

      ExpandedWrap disabled
        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]);
                }
         
            }


      Также убрал ДатаЛайн, пока все))

      Добавлено
      Все же надо прямо в программе все делить...

      Может заменить эту строчку

      ExpandedWrap disabled
         frames.append(frame);


      На эту надо? Или как...


      ExpandedWrap disabled
        frames.add(frame);


      Добавлено
      Выдает ошибку такую кстати:

      Exception in thread "main" java.lang.ArrayStoreException

      Ну и с аппендом:
      The method append(float[]) is undefined for the type ArrayList<float[]>
        Уважаемый MrKor. Чтобы получить совет, нужно поработать самому немного. Руками и мозгом. Не ожидайте, что кто-то будет разгребать кашу в Вашей голове.

        Как я уже писал, не нужно выкладывать программу по частям. Части не собираются в полную картину. Доступа на Ваш компьютер у меня нет, в ФСБ я не работаю, мои штатные телепаты в отпуске. Пока вы не выложите программу целиком в полном удобном виде, тяжело Вам подсказать, что у Вас на компьютере происходит.

        Цитата
        Выдает ошибку такую кстати:
        Exception in thread "main" java.lang.ArrayStoreException


        Если выдаётся ошибка, стоит задуматься о её причинах, попытаться понять, почему ошибка возникает, попробовать исправить ситуацию самому. Обычно такие ошибки легко решаются, если чуть-чуть пошевелить мозгами. Решение таких ошибок - основная часть работы программиста, ей нужно учиться.
        Сообщение отредактировано: nsh -
          Вот и архивчик:
          Прикреплённый файлПрикреплённый файлSoundeD.rar (23,88 Кбайт, скачиваний: 132)

          Надеюсь так будет лучше, example файл там для тестов...

          Добавлено
          Попробовал решить вот так вот:

          ExpandedWrap disabled
            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;
                    }
                }
             
            }


          Все равно вылезает эта чортова ошибка...

          Добавлено
          Я думал там был стык байтов с дублями, а оказалось в другом проблемка...
            Почти написал программку делящую файл на равные кусочки) Завтра выложу!
              ПамПамПам!)

              Вот и программка, поддерживает звукозаписи до 2.25 секунд(можно увеличить), что мне как раз подходит, ибо больше мне пока не надо)

              Файлик прикрепил, завтра попробую соединить все вместе и провести маленькие тесты)

              Думаю, nsh, вы покруче меня шарите в программной части, поделитесь, пожалуйста! Какие недостатки есть сейчас.

              Прикреплённый файлПрикреплённый файлexample.java (4,02 Кбайт, скачиваний: 195)

              Добавлено
              Её можно улучшить в сотни раз..Чем я и займусь, надо все это сделать автоматом..Чтобы только время можно было вводить, а она тебе массивы отдавала бы))
                Цитата
                Прикреплённый файл: SoundeD.rar (23,88 Кбайт, скачиваний: 2)


                Уже лучше

                Если Вы прочитаете документацию по ArrayStoreException, Вам станет понятно, что причиной ошибки является попытка поместить элемент в массив несовместимого типа. В Вашем случае Вы пытаетесь скопировать из массива типа byte в массив типа float. ТАк нельзя делать.

                Сначала нужно преобразовать сигнал в вид float, это Вы уже делали. Потом разбивать на окна. Вы этап преобразования пропустили.

                Если Eclipse подчеркивает метод add, это означает, что такой метод отсутствует. Нужно поискать похожий метод, для класса ArrayList это append.
                  Цитата nsh @
                  Сначала нужно преобразовать сигнал в вид float, это Вы уже делали. Потом разбивать на окна. Вы этап преобразования пропустили.

                  Аааааа, а я думал сначала разделить, а потом уже делать.Спасибки!

                  Попробую сейчас!
                    Попробовал еще раз все сделать, прикрепил в архивчике кодец. Прикреплённый файлПрикреплённый файлSoundeD.rar (23,66 Кбайт, скачиваний: 121)

                    Опять ошибка, теперь ошибка java.lang.ArrayIndexOutOfBoundsException, то бишь не существующий элемент массива...

                    УЖ не знаю что там и как, разделял frame_size frame_shift на два, все равно не помогло...

                    Преобразование сделал.Метод add не подчеркивает, а метод append подчеркивает. Кстати, если что у меня Java 6, может быть какие-то проблемы могут и из-за этого возникнуть...

                    Попробую исправить

                    Добавлено
                    Кстати, когда я преобразование сделал, то размер основного массива в 8 раз уменьшился.. Может стоит изменить размеры переменных? ( frame_size frame_shift ) Разделение этих переменных ( 410 и 320) на 8 не помагает..
                      А вот если 256 подставить, как значение двум переменных, то все работает!)
                        Чтобы не возникало выхода за границы в цикле должно быть такое ограничение:

                        ExpandedWrap disabled
                                for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift)

                        вместо

                        ExpandedWrap disabled
                                for (int i = 0; i < inbuf.length; i = i + frame_shift)
                          Спасибо!
                          Числа я оставил те же:
                          ExpandedWrap disabled
                            int frame_size = 410;
                                int frame_shift = 320;


                          Только вот проблемка, если вы смотрели код, то могли видеть, что длина inbuf = 512...

                          После деления на окна у меня создается 1 массив.Так что не знаю...По сути это же тоже самое, что и без этого деления на окна,может ч=стоит где то что то поменять? например, числа..Просто если массив inbuf делать больше, чем 512, то вылезает куча ошибок в MFCC..
                            Цитата
                            могли видеть, что длина inbuf = 512...
                            После деления на окна у меня создается 1 массив.Так что не знаю...


                            Когда декодируете длина полученного результата должна определяться из длины прочитанных данных, а не жёстко задаваться.
                              Так тут без задавания - никак, мы же массив создаем:
                              double[] inbuf = new double[size];

                              Где size , собс-но, его длинна...

                              Добавлено
                              Хотя, мы же можем поставить длинну такую же, какую имеет начальный массив байт, мы же все потом все равно поделим!

                              Добавлено
                              Уже проверил, кстати, с длинной, как у начального массива, все отлично работает! И деление происходит.
                                Вот такие результаты получаю:

                                ExpandedWrap disabled
                                   | -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


                                ExpandedWrap disabled
                                   | 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


                                ExpandedWrap disabled
                                   | -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

                                Небольшие сходства есть, если приглядеться ко второй и третьей части графика...

                                Вот векторы к этому графику:

                                ExpandedWrap disabled
                                   | -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


                                ExpandedWrap disabled
                                   | 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


                                ExpandedWrap disabled
                                   | 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
                                Сообщение отредактировано: MrKor -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0583 ]   [ 21 queries used ]   [ Generated: 9.05.24, 14:48 GMT ]