На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD, nsh
Страницы: (23) « Первая ... 16 17 [18] 19 20 ...  22 23  ( Перейти к последнему сообщению )  
> Работа с CMU Sphinx , Работа с CMU Sphinx 4.0
    Цитата webmax @
    При добавлении русских слов в javascript`е, консоль выдает такую ошибку:


    Выложите все используемые файлы в архиве. Чем более полную информацию Вы предоставите, тем быстрее получите ответ.

    Сообщения были разделены в тему "Сборка node-pocketsphinx"
      Коллеги, добрый день.

      Стоит задача распознавать записи разговоров колл-центра (speech to text).

      Что есть - файлы записей (отдельно записана каждая сторона разговора, WAV, 8 kHz, 16 bit signed, little-endian, mono).

      Что сделал: приложение на основе демки Transcriber с использованием Sphinx4-5prelapha, акустическая модель - zero_ru_cont_8k_v3/zero_ru.cd_cont_4000, словарь и языковая модель оттуда же. Настроить SampleRate на 8000 не забыл.

      Что еще сделал: прочитал туториал и фак, прогуглил интернет, почитал тикеты на соурсфорже, прочел весь этот тред.

      Что получилось: получилось субьективно "не очень", в приближении к "весьма плохо". Где-то около 20% правильно распознанных слов, плюс/минус лапоть. Файл с записью "здравствуйте" трактуется как "тогда путям".

      Что еще пробовал: включать/отключать использование speakerProfile по примеру из демки. Результаты меняются незначительно и непонятно, в какую сторону. Хотелось бы какой-то комментарий по этому поводу — чего стоит ожидать от speakerProfile?
      ExpandedWrap disabled
        try (InputStream stream = new BufferedInputStream(new FileInputStream(waveFileName)))
        {
            stream.skip(44); //skip header          
            
            // Stats class is used to collect speaker-specific data
            Stats stats = recognizer.createStats(1);
            recognizer.startRecognition(stream);
            SpeechResult result;
            while ((result = recognizer.getResult()) != null)
            {
                stats.collect(result);
            }
            recognizer.stopRecognition();
            System.gc();
            
            Transform transform = stats.createTransform();
            recognizer.setTransform(transform);
        }
         
        try (InputStream stream = new BufferedInputStream(new FileInputStream(waveFileName)))
        {
            stream.skip(44); //skip header
            recognizer.startRecognition(stream);
            StringBuilder builder = new StringBuilder();
            SpeechResult result;
            while ((result = recognizer.getResult()) != null)
            {
                ResultToStringDetails(result, builder);
            }
            recognizer.stopRecognition();
            return builder.toString();
        }

      Еще сразу вопросы по коду. На сколько я понял, при повторном прогоне распознавания, вызов recognizer.startRecognition заново грузит модель. Я так понимаю, это связано с тем, что я использую high-level API, которое в общем-то не предназначено для чего-то серьезного. В перспективе мне надо многопоточно обрабатывать большое количество файлов, и я бы хотел шарить как можно больше ресурсов. Судя по этому треду большую часть ресурсов действительно можно шарить, но нужно low-level API. Где бы мне про него почитать?

      Дальше, меня несколько смущает магический код stream.skip(44). Это действительно рекомендованный вариант для работы с wav-файлами?


      Что еще пробовал: другие модели из zero_ru_cont_8k_v3 (zero_ru.cd_ptm_4000 и zero_ru.cd_semi_4000). В обоих случаях выпадает IndexOutOfBoundsException
      Скрытый текст

      Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1024, Size: 1024
      at java.util.ArrayList.rangeCheck(ArrayList.java:653)
      at java.util.ArrayList.get(ArrayList.java:429)
      at edu.cmu.sphinx.linguist.acoustic.tiedstate.Pool.get(Pool.java:55)
      at edu.cmu.sphinx.linguist.acoustic.tiedstate.Sphinx3Loader.createSenonePool(Sphinx3Loader.java:428)
      at edu.cmu.sphinx.linguist.acoustic.tiedstate.Sphinx3Loader.loadModelFiles(Sphinx3Loader.java:313)
      at edu.cmu.sphinx.linguist.acoustic.tiedstate.Sphinx3Loader.load(Sphinx3Loader.java:252)
      at edu.cmu.sphinx.frontend.AutoCepstrum.newProperties(AutoCepstrum.java:118)
      at edu.cmu.sphinx.util.props.PropertySheet.getOwner(PropertySheet.java:518)
      at edu.cmu.sphinx.util.props.ConfigurationManager.lookup(ConfigurationManager.java:163)
      at edu.cmu.sphinx.util.props.PropertySheet.getComponentList(PropertySheet.java:432)
      at edu.cmu.sphinx.frontend.FrontEnd.newProperties(FrontEnd.java:160)
      at edu.cmu.sphinx.util.props.PropertySheet.getOwner(PropertySheet.java:518)
      at edu.cmu.sphinx.util.props.PropertySheet.getComponent(PropertySheet.java:296)
      at edu.cmu.sphinx.decoder.scorer.SimpleAcousticScorer.newProperties(SimpleAcousticScorer.java:47)
      at edu.cmu.sphinx.util.props.PropertySheet.getOwner(PropertySheet.java:518)
      at edu.cmu.sphinx.util.props.PropertySheet.getComponent(PropertySheet.java:296)
      at edu.cmu.sphinx.decoder.search.WordPruningBreadthFirstSearchManager.newProperties(WordPruningBreadthFirstSearchManager.java:213)
      at edu.cmu.sphinx.decoder.search.WordPruningBreadthFirstLookaheadSearchManager.newProperties(WordPruningBreadthFirstLookaheadSearchManager.java:156)
      at edu.cmu.sphinx.util.props.PropertySheet.getOwner(PropertySheet.java:518)
      at edu.cmu.sphinx.util.props.PropertySheet.getComponent(PropertySheet.java:296)
      at edu.cmu.sphinx.decoder.AbstractDecoder.newProperties(AbstractDecoder.java:81)
      at edu.cmu.sphinx.decoder.Decoder.newProperties(Decoder.java:36)
      at edu.cmu.sphinx.util.props.PropertySheet.getOwner(PropertySheet.java:518)
      at edu.cmu.sphinx.util.props.PropertySheet.getComponent(PropertySheet.java:296)
      at edu.cmu.sphinx.recognizer.Recognizer.newProperties(Recognizer.java:86)
      at edu.cmu.sphinx.util.props.PropertySheet.getOwner(PropertySheet.java:518)
      at edu.cmu.sphinx.util.props.ConfigurationManager.lookup(ConfigurationManager.java:163)
      at edu.cmu.sphinx.api.Context.<init>(Context.java:73)
      at edu.cmu.sphinx.api.Context.<init>(Context.java:45)
      at edu.cmu.sphinx.api.AbstractSpeechRecognizer.<init>(AbstractSpeechRecognizer.java:44)
      at edu.cmu.sphinx.api.StreamSpeechRecognizer.<init>(StreamSpeechRecognizer.java:35)
      at .FileRecognizer.ProcessWaveFileSpeakerProfile(FileRecognizer.java:118)
      at .FileRecognizer.ProcessWaveFile(FileRecognizer.java:53)
      at .Program.ProcessFile(Program.java:83)
      at .Program.main(Program.java:67)

      На второй странице этого треда предлагается в похожем случае обратиться к документации, но рекомендованная ссылка уже устарела. Методом пристального всматривания в код понять тоже ничего не удалось, действительно почему-то происходит попытка чтения за границами массива. Я что-то делаю не так?

      Что еще пробовал делать: вместо сборки сфинкса из репы с сонатайпа, собирать либу из исходников. Разницы нет. (Только что заметил, что в репе довольно свежая версия уже).

      Что планирую делать: попытаться выполнить шаги из фака "Q: Why my accuracy is poor", но, если честно, мне не совсем понятна уже начальная часть "You need to dump utterances into wav files, write reference text and use decoder to decode it." Можно ли чуть более подробнее рассказать об этом? Например, кто такой "декодер" в данном случае? Под "dump utterances into wav files" подразумевается просто сохранить получасовую запись с микрофона в вавку, или что-то более конкретное?

      Что еще планирую делать: попробовать сконвертить языковую модель в новый формат, но как я понимаю, на результате работы это никак не скажется, только на времени загрузки?

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

      Буду признателен за любые другие советы, поскольку не уверен, что спросил все, что нужно было.
        Сложнось вашей задачи "высокая".
        Лучше закажите услугу у ЦРТ или Яндекс.
          Спасибо за ответ! Хотя, конечно, я удивлен услышать такое от автора модели русского языка для Сфинкса.

          На самом деле я немного погонял решение от Яндекса, и там, где Сфинкс выдает "да ты с вами отчалить они строки назад коня а ноги она группа берданка", Яндекс отдает довольно вразумительный текст.

          Понятно, что задача "плохая". Но с другой стороны — сдаваться сразу и идти на поклон к корпоративщикам, которые даже не могут указать открыто цену своих услуг, выглядит как-то неспортивно.
            Цитата
            но нужно low-level API. Где бы мне про него почитать?


            В исходниках

            Цитата
            Дальше, меня несколько смущает магический код stream.skip(44). Это действительно рекомендованный вариант для работы с wav-файлами?


            44 - размер заголовка wav, магии тут нет.

            Цитата
            Что еще пробовал: другие модели из zero_ru_cont_8k_v3 (zero_ru.cd_ptm_4000 и zero_ru.cd_semi_4000). В обоих случаях выпадает IndexOutOfBoundsException


            Это ожидаемо, модели ptm и semi Вам не нужны, они для мобильных приложений

            Цитата
            Можно ли чуть более подробнее рассказать об этом? Например, кто такой "декодер" в данном случае? Под "dump utterances into wav files" подразумевается просто сохранить получасовую запись с микрофона в вавку, или что-то более конкретное?


            Декодер - pocketsphinx_batch. utterance это речевой отрезок или фраза. Нужно разбить большую запись на отдельные фразы и каждую записать в свой файл. Пример тестирования описан здесь:

            http://cmusphinx.sourceforge.net/wiki/tuto..._the_adaptation


            Цитата
            Что еще планирую делать: попробовать сконвертить языковую модель в новый формат, но как я понимаю, на результате работы это никак не скажется, только на времени загрузки?


            Общение в центрах обычно достаточно специфичное, общие модели языка его очень плохо описывают. Обычно нужно создать новую модель языка из настоящих транскриций переговоров. Хотя бы 10-20 часов нужно перевести в текст вручную.

            Цитата
            Что еще хотелось бы знать: Судя по результатам опроса на изготовление новой языковой модели, лидирует русский язык. Есть ли какие-то ориентировочные сроки, когда это могло бы случиться?


            Не ранее осени.

            Цитата
            выглядит как-то неспортивно.


            - Вот!
            - Что это?
            - Ну мы хотим такое же.
            - Понимаете, в это вбухано 2 миллиона долларов.
            - Значит не можете?
            - Можем.
            - Давайте начнем!
            - Ну тогда давайте 2 миллиона долларов.
            - У нас есть 10 000 долларов.
            - Понимаете, в это вбухано 2 миллиона долларов.
            - Вы с ума сошли, за что здесь 2 миллиона долларов?! Ну к тому же мы сказали, что у нас есть десять тысяч.
            - Здесь, значит, вот это, а тут это. Вон то еще. Это все дорого стоит.
            - Понятно. Значит не можете. А нам вас рекомендовали, как хороших специалистов.
            Сообщение отредактировано: nsh -
              Николай, спасибо за ответы!

              Цитата nsh @
              Это ожидаемо, модели ptm и semi Вам не нужны, они для мобильных приложений


              Ясно, я думал, что просто не умею их готовить.


              Цитата nsh @
              Пример тестирования описан здесь:


              Спасибо, стало гораздо понятнее!


              Цитата nsh @
              Обычно нужно создать новую модель языка из настоящих транскриций переговоров. Хотя бы 10-20 часов нужно перевести в текст вручную.


              Спасибо за пояснение, и оценку объема. Я как раз размышлаю, что пробовать в первую очередь — модифицировать языковую модель, или адаптировать акустическую?
              Для адаптации акустической модели, как я понимаю, понадобится значительно меньше транскрибированных записей, но зато их нужно будет нарезать на фразы. Я пока склоняюсь начать с языковой модели.


              Цитата nsh @
              - Понятно. Значит не можете. А нам вас рекомендовали, как хороших специалистов.


              Честно говоря, я долго думал, что на это ответить. Наверное я просто не до конца понимаю, что вы хотели сказать. Или я изначально плохо пояснил.

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

              Я воспринял ответ Замира в том ключе, что проще и быстрее купить готовое коммерческое решение, чем довести имеющееся опенсорс-решение до нужного мне уровня. Спорить тут трудно. Но тем не менее, мне кажется, что на данном этапе проблемы с качеством распознавания в основном заключаются в том, что я не правильно применяю инструмент. Мне кажется, я где-то встречал оценку, что на Сфинксе можно получить 50-60%-ную точность распознавания. Вот тут человек пишет, что добился фантастических 81% процента. Понятно, что скорее всего у него другая задача.

              Но также понятно, что если потратив 40 человеко/часов на транскрипцию 20и часов речи и построение модели, я могу вместо своих прискорбных условных 20% получить заметный прирост качества, то стыдно это не попробовать. Быть может мне вообще хватит 60и процентной точности. Если же я откажусь от попыток уже на самом старте — то я ничего не узнаю, ничему не научусь, и даже не получу уверенности в том, что услуги коммерческих решений стоят своих денег.

              Поэтому я скромно надеюсь, что мои потуги будут вами, Николай, и вами, Замир, восприняты не как недоверие к вашим знаниям и экспртизе (или банальная тупость), а как попытка углубиться в интересную для меня область путем решения конкретной практической задачи.
                Цитата
                Я воспринял ответ Замира в том ключе, что проще и быстрее купить готовое коммерческое решение

                Да я хотел сказать именно это, с учётом поставленной вами задачи.
                В телефонных записях хорошо только одно - микрофон рядом, всё остальное - сплошные трудности.
                Я подумал, что вам нужно решение... если для вас это только хобби - "добро пожаловать в наш клуб" :)
                p.s. Николай не в нашем клубе, для него это больше чем хобби, он просто за нами присматривает :D

                Цитата
                Сфинксе можно получить 50-60%-ную точность распознавания

                при распозавании на уровне 50-60% смысл распознанной фразы остаётся непонятным
                  Цитата zamir @
                  Я подумал, что вам нужно решение... если для вас это только хобби


                  Скорее что-то среднее )

                  Цитата zamir @
                  "добро пожаловать в наш клуб"


                  Спасибо!
                    Цитата nsh @
                    44 - размер заголовка wav, магии тут нет.


                    Просто я ожидал чего-то вида

                    ExpandedWrap disabled
                      public class WaveInputStream extends InputStream
                      {
                          private final InputStream m_stream;
                          public WaveInputStream(InputStream stream, Configuration config)
                          {
                               WaveHeader header = new WaveHeader(stream);
                               if (!"RIFF".equals(header.chunkId)  || !"WAVE".equals(header.format))
                               {
                                   throw new IllegalArgumentException("Input is not a RIFF Wave file");
                               }
                               if (header.audioFormat != 1)
                               {
                                   throw new IllegalArgumentException("Input is not a PCM file");
                               }
                               if (header.numChannels != 1)
                               {
                                   throw new IllegalArgumentException("Input is not a mono file");
                               }
                               if (header.sampleRate != config.getSampleRate())
                               {
                                   throw new IllegalArgumentException("Input sample rate does not match configured rate");
                               }
                               m_stream = stream;
                          }
                      ...


                    или
                    ExpandedWrap disabled
                      Configuration.readAndCheckWaveHeader(InputStream stream)

                    поэтому и спрашивал про "рекомендованный вариант". В частности мне бы это позволило быстрее понять, что я умудрился криво порезать файлы sox'ом (левый канал писал в моно, а правый в стерео :wacko: )
                    Сообщение отредактировано: mikemvpi -
                      Цитата
                      Спасибо за пояснение, и оценку объема. Я как раз размышлаю, что пробовать в первую очередь — модифицировать языковую модель, или адаптировать акустическую?
                      Для адаптации акустической модели, как я понимаю, понадобится значительно меньше транскрибированных записей, но зато их нужно будет нарезать на фразы. Я пока склоняюсь начать с языковой модели.


                      Для адаптации акустической модели нужны записи сотен пользователей. Лучше начать с адаптации языковой модели.

                      Цитата
                      Но также понятно, что если потратив 40 человеко/часов на транскрипцию 20и часов речи и построение модели, я могу вместо своих прискорбных условных 20% получить заметный прирост качества, то стыдно это не попробовать. Быть может мне вообще хватит 60и процентной точности. Если же я откажусь от попыток уже на самом старте — то я ничего не узнаю, ничему не научусь, и даже не получу уверенности в том, что услуги коммерческих решений стоят своих денег.


                      Скорость ручной транскрипции гораздо медленнее. Я обычно трачу 7 часов на транскрипцию одного часа. При транскрипции нужно очень точно писать, что было произнесено, включая междометия и подобные слова.
                        Спасибо за рекомендации и оценку времени!

                        Цитата nsh @
                        При транскрипции нужно очень точно писать, что было произнесено, включая междометия и подобные слова.

                        Спасибо за уточнение! Попробую для начала немного изучить исходники текущей модели, их же можно найти?

                        Еще вопрос — надо ли отмечать шумы при транскрипции? Я так понимаю, что для них фонемы в принципе можно описать, но в чем смысл, если все равно в filler dictionary они транслейтятся в sil?

                        И еще вопрос по шумам. В текущей модели русской речи сказано "all noise marked as SIL" и рекомендовано использование опции "-remove_noise no". В high-level API я не нашел соответствия. Нужно искать глубже?
                          Цитата nsh @
                          Это ожидаемо, модели ptm и semi Вам не нужны, они для мобильных приложений


                          Просто в документации пишут следующее:
                          Цитата
                          In modern packages of pocketsphinx and sphinx4 PTM models are used by default.

                          Возможно стоит обновить документацию?
                            Цитата
                            В текущей модели русской речи сказано "all noise marked as SIL"

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

                            Цитата
                            и рекомендовано использование опции "-remove_noise no"

                            уже не помню точно, но возможно с этой опцией создавались фитчи для тренировки, поэтому и распознавать надо с теми же опциями
                            Сообщение отредактировано: zamir -
                              Цитата zamir @
                              уже не помню точно, но возможно с этой опцией создавались фитчи для тренировки, поэтому и распознавать надо с теми же опциями


                              Я просто не соображу, как эту опцию скормить в Sphinx4.
                                Цитата
                                Спасибо за уточнение! Попробую для начала немного изучить исходники текущей модели, их же можно найти?


                                Большая часть доступна на Voxforge:

                                http://www.repository.voxforge1.org/downlo...in/16kHz_16bit/

                                Цитата
                                Еще вопрос — надо ли отмечать шумы при транскрипции? Я так понимаю, что для них фонемы в принципе можно описать, но в чем смысл, если все равно в filler dictionary они транслейтятся в sil?


                                Надо, в будущем пригодятся

                                Цитата
                                И еще вопрос по шумам. В текущей модели русской речи сказано "all noise marked as SIL" и рекомендовано использование опции "-remove_noise no". В high-level API я не нашел соответствия. Нужно искать глубже?


                                remove_noise убирает стационарный белый шум, нестационарные шумы нужно отмечать.

                                Цитата
                                Я просто не соображу, как эту опцию скормить в Sphinx4.


                                Никак не надо, автоматически используется настройка из feat.params.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (23) « Первая ... 16 17 [18] 19 20 ...  22 23


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