2012-03-23 3 views
0

Я хочу использовать pocketShpinx для создания слова речи. У меня установлена ​​sphinxbase и pocketSphinx. Загрузите акустическую модель/модель/словарь. Тогда я протестировать example code так же, как следует:Как улучшить точность cmuSphinx?

#include <pocketsphinx/pocketsphinx.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include "debug.h" 

int main(int argc, char *argv[]) 
{ 
    ps_decoder_t *ps; 
    cmd_ln_t  *config; 
    FILE *fh; 
    int rv; 
    char const *hyp, *uttid; 
    int32 score; 

    config = cmd_ln_init(NULL, ps_args(), TRUE, 
         "-hmm", "/home/madper/speech/hub4opensrc.cd_continuous_8gau", 
         "-lm", "/home/madper/speech/language_model.arpaformat.DMP", 
         "-dict", "/home/madper/speech/cmudict/cmudict/sphinxdict/cmudict_SPHINX_40", 
         NULL); 
    if (config == NULL) 
    { 
     DBG (("cmd_ln_init() failed.\n")); 
     exit(1); 
    } 
    if ((ps = ps_init (config)) == NULL) /* init decoder */ 
    { 
     DBG (("ps_init() failed.\n")); 
     exit(1); 
    } 
    if ((fh = fopen("test.raw", "rb")) == NULL) /* open raw file */ 
    { 
     DBG (("fopen() failed.\n")); 
     exit (1); 
    } 
    if ((rv = ps_decode_raw (ps, fh, "test", -1)) < 0) 
    { 
     DBG (("ps_decode_raw() error!\n")); 
     exit (1); 
    } 
    if ((hyp = ps_get_hyp(ps, &score, &uttid)) == NULL) 
    { 
     DBG (("ps_get_hyp() failed!\n")); 
     exit (1); 
    } 
    printf ("Recognized: %s\n", hyp); /* this is what you say */ 

    fclose(fh); 
    ps_free(ps); 
    return 0; 
} 

DBG просто макрос печатает сообщение об ошибке, если определено DEBUG.


Затем я пишу код для записи с использованием микрофона alsa. Как следует:

#define ALSA_PCM_NEW_HW_PARAMS_API 

#include <alsa/asoundlib.h> 

int main() { 
    long loops; 
    int rc; 
    int size; 
    snd_pcm_t *handle; 
    snd_pcm_hw_params_t *params; 
    unsigned int val; 
    int dir; 
    snd_pcm_uframes_t frames; 
    char *buffer; 

    /* Open PCM device for recording (capture). */ 
    rc = snd_pcm_open(&handle, "default", 
        SND_PCM_STREAM_CAPTURE, 0); 
    if (rc < 0) { 
    fprintf(stderr, 
      "unable to open pcm device: %s\n", 
      snd_strerror(rc)); 
    exit(1); 
    } 

    /* Allocate a hardware parameters object. */ 
    snd_pcm_hw_params_alloca(&params); 

    /* Fill it in with default values. */ 
    snd_pcm_hw_params_any(handle, params); 

    /* Set the desired hardware parameters. */ 

    /* Interleaved mode */ 
    snd_pcm_hw_params_set_access(handle, params, 
         SND_PCM_ACCESS_RW_INTERLEAVED); 

    /* Signed 16-bit little-endian format */ 
    snd_pcm_hw_params_set_format(handle, params, 
           SND_PCM_FORMAT_S16_LE); 

    /* Two channels (stereo) */ 
    snd_pcm_hw_params_set_channels(handle, params, 1); 

    /* 44100 bits/second sampling rate (CD quality) */ 
    val = 16000; 
    snd_pcm_hw_params_set_rate_near(handle, params, 
            &val, &dir); 

    /* Set period size to 32 frames. */ 
    frames = 16; 
    snd_pcm_hw_params_set_period_size_near(handle, 
           params, &frames, &dir); 

    /* Write the parameters to the driver */ 
    rc = snd_pcm_hw_params(handle, params); 
    if (rc < 0) { 
    fprintf(stderr, 
      "unable to set hw parameters: %s\n", 
      snd_strerror(rc)); 
    exit(1); 
    } 

    /* Use a buffer large enough to hold one period */ 
    snd_pcm_hw_params_get_period_size(params, 
             &frames, &dir); 
    size = frames * 2; /* 2 bytes/sample, 2 channels */ 
    buffer = (char *) malloc(size); 

    /* We want to loop for 5 seconds */ 
    snd_pcm_hw_params_get_period_time(params, 
             &val, &dir); 
    loops = 2000000/val; 

    while (loops > 0) { 
    loops--; 
    rc = snd_pcm_readi(handle, buffer, frames); 
    if (rc == -EPIPE) { 
     /* EPIPE means overrun */ 
     fprintf(stderr, "overrun occurred\n"); 
     snd_pcm_prepare(handle); 
    } else if (rc < 0) { 
     fprintf(stderr, 
       "error from read: %s\n", 
       snd_strerror(rc)); 
    } else if (rc != (int)frames) { 
     fprintf(stderr, "short read, read %d frames\n", rc); 
    } 
    rc = write(1, buffer, size); 
    if (rc != size) 
     fprintf(stderr, 
       "short write: wrote %d bytes\n", rc); 
    } 

    snd_pcm_drain(handle); 
    snd_pcm_close(handle); 
    free(buffer); 

    return 0; 
} 

Итак, я запись raw файл. Затем выполните речевой тест в этом файле. Но точность очень ничтожная. Точно так же, как hello или go home даст мне hotel или MHM MHM и так далее. Итак, что не так с этим кодом? Я прочитал faqs, следует ли использовать адаптацию акустической модели для повышения точности?

PS. Я меняю стерео на моно. И звук странный. Я не понимаю, что я сказал. Итак, что в этом плохого? Это тот необработанный файл test.raw

ответ

2

Если вы посмотрите на первые Q и A в http://cmusphinx.sourceforge.net/wiki/faq, вы заметите, что библиотека принимает монофонические данные.

Вы записываете в стерео.

+0

О, спасибо большое !!! Я забыл об этом. – madper

+0

Я изменил его на моноданные. Но точность все еще очень плохая. – madper

+0

Вы можете предоставить аудиофайл, который хотите распознать, чтобы получить более подробную помощь. Обычно вам нужно написать лучшую грамматику или построить лучшую модель языка, чтобы соответствовать тексту, который вы собираетесь распознать. –

Смежные вопросы