Почему у меня плохое распознавание Sphinx4?

Я изучаю, как использовать Sphinx4 с помощью подключаемого модуля Maven для Eclipse.

Я взял демонстрацию расшифровки, найденную на GitHub, и изменил ее, чтобы обработать собственный файл. Аудиофайл 16 бит, моно, 16 кГц. Это примерно 13 секунд. Я заметил, что это звучит как в замедленной съемке.

В файле говорится: «Также убедитесь, что вам легко получить доступ к файлам записи, чтобы вы могли загрузить их, если попросят».

Я пытаюсь расшифровать файл, и мои результаты ужасны. Мои попытки найти сообщения на форуме или ссылки, которые подробно объясняют, как улучшить результаты или что я делаю неправильно, ни к чему меня не привели.

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

КОД

(ПРИМЕЧАНИЕ: аудиофайл доступен по адресу https://instaud.io/8qv)

public class App {

public static void main(String[] args) throws Exception {
    System.out.println("Loading models...");

    Configuration configuration = new Configuration();

    // Load model from the jar
    configuration
            .setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us");

    // You can also load model from folder
    // configuration.setAcousticModelPath("file:en-us");

    configuration
            .setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict");
    configuration
            .setLanguageModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us.lm.dmp");

    StreamSpeechRecognizer recognizer = new StreamSpeechRecognizer(
            configuration);
    FileInputStream stream = new FileInputStream(new File("/home/tmscanlan/workspace/example/vocaroo_test_revised.wav"));
   // stream.skip(44); I commented this out due to the short length of my file

    // Simple recognition with generic model
    recognizer.startRecognition(stream);
    SpeechResult result;

    while ((result = recognizer.getResult()) != null) {
        // I added the following print statements to get more information
        System.out.println("\ngetWords() before loop: " + result.getWords());
        System.out.format("Hypothesis: %s\n", result.getHypothesis());
        System.out.print("\nThe getResult(): " + result.getResult() 
                + "\nThe getLattice(): " + result.getLattice()); 

        System.out.println("List of recognized words and their times:");
        for (WordResult r : result.getWords()) {
            System.out.println(r);
        }

        System.out.println("Best 3 hypothesis:");
        for (String s : result.getNbest(3))
            System.out.println(s);

    }
    recognizer.stopRecognition();

    // Live adaptation to speaker with speaker profiles


    stream = new FileInputStream(new File("/home/tmscanlan/workspace/example/warren_test_smaller.wav"));
   // stream.skip(44); I commented this out due to the short length of my file

    // Stats class is used to collect speaker-specific data
    Stats stats = recognizer.createStats(1);
    recognizer.startRecognition(stream);
    while ((result = recognizer.getResult()) != null) {
        stats.collect(result);
    }
    recognizer.stopRecognition();

    // Transform represents the speech profile
    Transform transform = stats.createTransform();
    recognizer.setTransform(transform);

    // Decode again with updated transform
    stream = new FileInputStream(new File("/home/tmscanlan/workspace/example/warren_test_smaller.wav"));
   // stream.skip(44); I commented this out due to the short length of my file
    recognizer.startRecognition(stream);
    while ((result = recognizer.getResult()) != null) {
        System.out.format("Hypothesis: %s\n", result.getHypothesis());
    }
    recognizer.stopRecognition();


    System.out.println("...Printing is done..");
}
}

Вот результат (фотоальбом, который я сделал): http://imgur.com/a/Ou9oH


person tmsBoston    schedule 23.06.2015    source источник
comment
Вы можете поделиться аудиофайлом, чтобы получить помощь, изображения бесполезны   -  person Nikolay Shmyrev    schedule 23.06.2015
comment
instaud.io/8qn, если эта ссылка не работает или есть лучший способ поделиться аудио, дайте мне знать.   -  person tmsBoston    schedule 23.06.2015
comment
Ну, как вы можете слышать, файл не записан должным образом. Вы могли бы записать это правильно в первую очередь.   -  person Nikolay Shmyrev    schedule 23.06.2015
comment
Что значит не правильно записано? Медленность записи из-за конвертации в 16кГц. Нужно ли записывать в 16 кГц, а не конвертировать?   -  person tmsBoston    schedule 24.06.2015
comment
instaud.io/8qv ‹ — это исходная запись. Я также тестировал другие файлы, такие как небольшие 10-секундные сегменты речей, и эти результаты были столь же плохими.   -  person tmsBoston    schedule 24.06.2015
comment
вы не должны слышать медлительность, если правильно передискретизируете аудиофайл. Запустите эту команду: sox Vocaroo.wav -r 16000 Vocaroo16.wav. Выход будет звучать намного лучше, и это даст лучшие результаты.   -  person lCapp    schedule 24.06.2015


Ответы (1)


Как говорит Николай, звук звучит странно, возможно, потому, что вы не передискретизировали его должным образом. Чтобы понизить частоту звука с исходных 22050 Гц до желаемых 16 кГц, вы можете запустить следующую команду:

sox Vocaroo.wav -r 16000 Vocaroo16.wav

Vocaroo16.wav будет звучать намного лучше и (вероятно) даст вам лучшие результаты ASR.

person lCapp    schedule 24.06.2015
comment
Большое спасибо за реальный ответ. - person tmsBoston; 24.06.2015