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를 정의하면 오류 메시지를 인쇄하는 매크로입니다.


그럼 마이크를 사용하여 녹음 할 코드를 작성합니다. 예 :

#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을 읽었습니까?

추신. 스테레오를 모노로 바꿉니다. 그리고 소리가 이상합니다. 내가 한 말을 이해할 수 없다. 그래서, 그게 뭐가 잘못 됐어? 이것은 원시 파일입니다.

답변

2

http://cmusphinx.sourceforge.net/wiki/faq의 첫 번째 Q와 A를 보면 라이브러리가 모노 데이터로 간주됩니다.

스테레오로 녹음합니다.

+0

아, 정말 고마워요! 나는 그것을 잊어 버린다. – madper

+0

모노 데이터로 변경했습니다. 그러나 정확도는 여전히 매우 열악합니다. – madper

+0

보다 자세한 도움말을 얻으려면 인식하려는 오디오 파일을 제공 할 수 있습니다. 보통 당신은 더 나은 문법을 작성하거나 당신이 인식하려고하는 텍스트에 맞는 더 나은 언어 모델을 만들어야합니다. –

관련 문제