2011-02-08 16 views
7

हैलो, मैं खेलने और एक लिनक्स (अधिमानतः उबंटू) सिस्टम पर रिकॉर्ड ऑडियो के लिए एक रास्ता तलाश रहे हैं। मैं वर्तमान में voice recognition toolkit पर फ्रंट-एंड पर काम कर रहा हूं जो PocketSphinx और Julius के लिए ध्वनि मॉडल को अनुकूलित करने के लिए आवश्यक कुछ चरणों को स्वचालित करेगा।सी ++ में लिनक्स पर आप ऑडियो (WAV पर) कैसे चलाते हैं या रिकॉर्ड करते हैं?

ऑडियो इनपुट/आउटपुट के वैकल्पिक साधन के सुझाव का स्वागत करते हैं , साथ ही बग नीचे दिखाया गया है करने के लिए एक ठीक कर रहे हैं।

यहाँ वर्तमान कोड मैं अब तक एक .WAV फ़ाइल खेलने के लिए उपयोग किया है है:

void Engine::sayText (const string OutputText) { 
    string audioUri = "temp.wav"; 
    string requestUri = this->getRequestUri(OPENMARY_PROCESS , OutputText.c_str()); 
    int error , audioStream; 
    pa_simple *pulseConnection; 
    pa_sample_spec simpleSpecs; 
    simpleSpecs.format = PA_SAMPLE_S16LE; 
    simpleSpecs.rate = 44100; 
    simpleSpecs.channels = 2; 

    eprintf(E_MESSAGE , "Generating audio for '%s' from '%s'..." , OutputText.c_str() , requestUri.c_str()); 
    FILE* audio = this->getHttpFile(requestUri , audioUri); 
    fclose(audio); 
    eprintf(E_MESSAGE , "Generated audio."); 

    if ((audioStream = open(audioUri.c_str() , O_RDONLY)) < 0) { 
     fprintf(stderr , __FILE__": open() failed: %s\n" , strerror(errno)); 
     goto finish; 
    } 

    if (dup2(audioStream , STDIN_FILENO) < 0) { 
     fprintf(stderr , __FILE__": dup2() failed: %s\n" , strerror(errno)); 
     goto finish; 
    } 

    close(audioStream); 

    pulseConnection = pa_simple_new(NULL , "AudioPush" , PA_STREAM_PLAYBACK , NULL , "openMary C++" , &simpleSpecs , NULL , NULL , &error); 

    for (int i = 0;;i++) { 
     const int bufferSize = 1024; 
     uint8_t audioBuffer[bufferSize]; 
     ssize_t r; 
     eprintf(E_MESSAGE , "Buffering %d..",i); 
     /* Read some data ... */ 
     if ((r = read(STDIN_FILENO , audioBuffer , sizeof (audioBuffer))) <= 0) { 
      if (r == 0) /* EOF */ 
       break; 

      eprintf(E_ERROR , __FILE__": read() failed: %s\n" , strerror(errno)); 
    if (pulseConnection) 
     pa_simple_free(pulseConnection); 

     } 

     /* ... and play it */ 
     if (pa_simple_write(pulseConnection , audioBuffer , (size_t) r , &error) < 0) { 
      fprintf(stderr , __FILE__": pa_simple_write() failed: %s\n" , pa_strerror(error)); 
    if (pulseConnection) 
     pa_simple_free(pulseConnection); 

     } 

     usleep(2); 

    } 
    /* Make sure that every single sample was played */ 
    if (pa_simple_drain(pulseConnection , &error) < 0) { 
     fprintf(stderr , __FILE__": pa_simple_drain() failed: %s\n" , pa_strerror(error)); 
    if (pulseConnection) 
     pa_simple_free(pulseConnection); 
    }  
} 

नोट: आप इस फाइल करने के लिए कोड के बाकी चाहते हैं, आप इसे लॉन्चपैड से सीधे here डाउनलोड कर सकते हैं ।

अद्यतन: मैं GStreamermm उपयोग करने की कोशिश, और यह काम नहीं करेगा:

Glib::RefPtr<Pipeline> pipeline; 
    Glib::RefPtr<Element> sink, filter, source; 
    Glib::RefPtr<Gio::File> audioSrc = Gio::File::create_for_path(uri); 

    pipeline = Pipeline::create("audio-playback"); 
    source = ElementFactory::create_element("alsasrc","source"); 
    filter = ElementFactory::create_element("identity","filter"); 
    sink = ElementFactory::create_element("alsasink","sink"); 
    //sink->get_property("file",audioSrc); 
    if (!source || !filter || !sink){ 
     showErrorDialog("Houston!","We got a problem."); 
     return; 
    } 
    pipeline->add(source)->add(filter)->add(sink); 
    source->link(sink); 

    pipeline->set_state(Gst::STATE_PLAYING); 
    showInformation("Close this to stop recording"); 
    pipeline->set_state(Gst::STATE_PAUSED); 
+0

का उपयोग कर सकते हैं यह [stackoverflow] (http://stackoverflow.com/) के लिए एक बेहतर सवाल होगा। –

+1

मैं खेल और रिकॉर्डिंग के लिए जीस्ट्रीमर लाइब्रेरी पर विचार करता हूं। लेकिन मुझे लगता है कि पल्स में रिकॉर्डिंग विकल्प भी होना चाहिए? – Petriborg

+0

@ माइकल मैंने इसे प्रोग्रामिंग पर पोस्ट किया, क्योंकि मुझे लगता है कि यह प्रोग्रामिंग से संबंधित था। @ पेट्रीबॉर्ग क्या आप ऐसा करने का तरीका प्रदर्शित कर सकते हैं या ** अच्छा ** लिंक कैसे करें? जीस्ट्रीमर केवल ओजीजी का समर्थन करता है और सीएमयूएसफिनक्स को डब्ल्यूएवी फाइलों की आवश्यकता होती है। – jackyalcine

उत्तर

4

The "Hello World" application in the GStreamer documentation कैसे एक ऑग/वॉर्बिस फ़ाइल को चलाने को दर्शाता है। WAV फ़ाइलों के साथ यह काम करने के लिए, आप "oavdemux" को "wavparse" के साथ प्रतिस्थापित कर सकते हैं और "पहचान" के साथ "vorbisdec" को प्रतिस्थापित कर सकते हैं (पहचान प्लगइन कुछ भी नहीं करता है - यह केवल प्लेसहोल्डर है)।

GStreamer (Ubuntu पर) के लिए विकास का समर्थन स्थापित करने के लिए ...

sudo apt-get install libgstreamer0.10-dev 

आप GStreamer पुस्तकालयों के उपयोग को सक्षम करने के जीसीसी कमांड लाइन पर निम्न की आवश्यकता है ...

$(pkg-config --cflags --libs gstreamer-0.10) 

वैसे, आपको कोड लिखने से पहले जीस्ट्रीमर पाइपलाइनों को प्रोटोटाइप करने के लिए "जीएसटी-लॉन्च" का उपयोग करना उपयोगी हो सकता है।

## recording 
gst-launch-0.10 autoaudiosrc ! wavenc ! filesink location=temp.wav 

## playback 
gst-launch-0.10 filesrc location=temp.wav ! wavparse ! autoaudiosink 

GStreamer का एक विशेषता है कि आवाज की पहचान के लिए उपयोगी हो सकता है कि यह एक पाइप लाइन में ऑडियो गुणवत्ता फिल्टर डालने के लिए आसान है - तो आप, उदाहरण के लिए, शोर है कि अन्यथा रिकॉर्डिंग में हो सकता है कम कर सकता है। जीस्ट्रीमर "अच्छा" प्लगइन की सूची में एक सूचक here है।

ब्याज के अलावा, "पॉकेटस्फिनक्स" (जो आपके प्रोजेक्ट से संबंधित प्रतीत होता है) में पहले से ही कुछ जीस्ट्रीमर एकीकरण है। Using PocketSphinx with GStreamer and Python

+0

मैंने इस एप्लिकेशन के लिए पायथन का उपयोग नहीं किया है; यह मुख्य रूप से सी ++ में कोड है, क्योंकि यह वह भाषा है जिसे मैं सबसे अच्छी तरह जानता हूं, लेकिन आप एक जबरदस्त मदद कर चुके हैं और मैं अपनी स्थिति के साथ जवाब दूंगा। – jackyalcine

+0

इसके अलावा, मैं पॉकेटस्फिनक्स/सीएमयूएसफिनक्स के लिए ध्वनि मॉडल को अनुकूलित करने के एक सुपर सरल तरीके को लागू करने का प्रयास कर रहा हूं। – jackyalcine

+0

@ जैकी: शुभकामनाएं! – nobar

1

जीस्ट्रीमर/पल्स/जैक बहुत अच्छे हैं। सरल और तेज़ चीजों के लिए आप SOX http://sox.sourceforge.net/

+0

क्या उनके पास एपीआई है? मैं कमांड लाइन का उपयोग नहीं कर सकता; मुझे वॉल्यूम को भी नियंत्रित करने में सक्षम होना चाहिए। – jackyalcine

+1

@ जैकी अल्सीन: libsox ध्वनि नमूना फ़ाइल प्रारूप पाठकों/लेखकों और ध्वनि प्रभाव प्रोसेसर की एक पुस्तकालय है। यह मुख्य रूप से सोएक्स द्वारा उपयोग के लिए विकसित किया गया है लेकिन किसी भी ध्वनि अनुप्रयोग के लिए उपयोगी है। हां, सोक्स को भी lib के रूप में उपयोग किया जा सकता है - विवरण के लिए संग्रह में बस लॉक –

संबंधित मुद्दे