您好,我一直在寻找一种在Linux(最好是Ubuntu)系统上播放和录制音频的方法。我目前正致力于语音识别工具包的前端工作,该工具包将自动完成为PocketSphinx和Julius调整语音模型所需的几个步骤。

欢迎提供音频输入/输出的替代方法的建议,以及对下面显示的错误的修复。

这是我到目前为止用来播放.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: %sn" , strerror( errno ) );

goto finish;

}

if ( dup2( audioStream , STDIN_FILENO ) < 0 ) {

fprintf( stderr , __FILE__": dup2() failed: %sn" , 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: %sn" , 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: %sn" , 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: %sn" , pa_strerror( error ) );

if ( pulseConnection )

pa_simple_free( pulseConnection );

}

}

注意:如果您希望将其余代码添加到此文件,可以直接从Launchpad下载。

更新:我尝试使用GStreamermm,这不起作用:

Glib::RefPtr pipeline;

Glib::RefPtr sink, filter, source;

Glib::RefPtr<: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);

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐