A Working Example in C

Included in this documentation is a working example that incorporates streaming audio, SRGS grammars, and Semantic Interpretation.  It is written in C, is based on examples throughout this documentation, and compiles under Visual C++ 6.0.

 

/////////////////////////////////////////////////////////////////////////////////////////////////////

//This C example is meant as a training vehicle for our C API.  This will initialize the Speech Port,

//load up some sample grammar concepts and a SRGS grammar, then open up an audio file for

//streaming to our Engine for decoding, and display the results.  The raw audio file is in 8k u-law.  

//This example will detect the end of speech then get the results from the Engine.

/////////////////////////////////////////////////////////////////////////////////////////////////////

 

#include <LV_SRE.h>

#include <stdio.h>

#include <iostream.h>

#include <winsock.h>

#include <fcntl.h>

 

#define IN_BUFFER_SIZE 1024

#define NUM_IN_BUFFERS 6

 

HPORT hport;

int VOICECHANNEL = 1;

 

//The call back function will check the various states of the engine.  For this example we only care about

//the STREAM_STATUS_STOPPED.  When this event occures then we will wait for the engine to idle which tells

//us that the decode has been performed.  When the decode is done then we get the results and display them.

 

void port_callback(long StreamStatus, unsigned long total_bytes, unsigned long recorded_bytes, void *userdata)

{

int iDecodeStatus;

int i = 0;

printf("Port Callback.\n");

 

switch(StreamStatus)

{

case STREAM_STATUS_NOT_READY:

printf("not ready\n");

break;

case STREAM_STATUS_READY:

printf("ready\n");

break;

case STREAM_STATUS_BARGE_IN:

printf("Barge In\n");

break;

case STREAM_STATUS_END_SPEECH:

printf("end of speech\n");

 

iDecodeStatus = LV_SRE_WaitForEngineToIdle(hport,VOICECHANNEL, 7000);

 

if(iDecodeStatus != LV_TIME_OUT)

{

printf("\nDecoded Transcript:\t%s\nConfidence Score:\t%d\nConcept Count:\t\t%d\n\n",

LV_SRE_GetInterpretationString(hport, VOICECHANNEL, i),

LV_SRE_GetConceptScore(hport, VOICECHANNEL, i),

LV_SRE_GetNumberOfConceptsReturned(hport, VOICECHANNEL));

}

break;

case STREAM_STATUS_STOPPED:

printf("stream stopped\n");

break;

case STREAM_STATUS_BARGE_IN_TIMEOUT:

printf("barge in time out\n");

break;

case STREAM_STATUS_END_SPEECH_TIMEOUT:

printf("EOS time out\n");

break;

}

}

 

//This function will open the audio file for streaming, fill up the stream buffers, and send the buffers to the engine

void Audio_Stream(char * filename)

{

int error_code;

const char * error_string;

double realtime_factor = 1.0;

int audio_buffer_size = 0;

int increment_ms = 300;

int bytes_per_sample = 1;

int samples_per_second = 8000;

int chunk_size = 2400;

char end_buffer[2400];

char * audio_buffer;

char* current_pos = audio_buffer;

int audio_length=0;

int audio_handle = _open(filename, _O_BINARY | _O_RDONLY);//_open("c:/PureDigitsAudio.raw", _O_BINARY | _O_RDONLY);

audio_buffer_size = _lseek(audio_handle, 0L,SEEK_END);

audio_buffer = (char *)malloc(audio_buffer_size);

 

current_pos = audio_buffer;

 

_close(audio_handle);

audio_handle = _open(filename, _O_BINARY | _O_RDONLY);//_open("c:/PureDigitsAudio.raw", _O_BINARY | _O_RDONLY);

 

_read(audio_handle, audio_buffer, audio_buffer_size);

_close(audio_handle);

chunk_size = bytes_per_sample*samples_per_second*increment_ms/1000;

memset(end_buffer,0,chunk_size);

error_code = LV_SRE_StreamStart(hport);

error_string = LV_SRE_ReturnErrorString(error_code);

 

printf("Streaming the audio.\n");

 

//filling up the buffers

while(current_pos != audio_buffer + audio_buffer_size)

{

if(audio_length + chunk_size > audio_buffer_size)

{

chunk_size = audio_buffer_size - audio_length;

}

 

audio_length +=chunk_size;

 

//sending the filled buffers to our Engine

error_code = LV_SRE_StreamSendData(hport,current_pos,chunk_size);

 

current_pos += chunk_size;

 

Sleep(increment_ms/realtime_factor);

 

}

}

void LoadGrammar(char * grammar_name, char * grammar_file)

{

int error_code;

 

printf("Loading the grammmar and activating it.\n");

 

//Here we are loading up a SRGS grammar.

error_code = LV_SRE_LoadGrammar(hport, grammar_name, grammar_file);

 

//Once you load up a grammar you can activate and deactivate it at any point during the call flow.

//For this example we will activate it immediately.

error_code = LV_SRE_ActivateGrammar(hport, grammar_name);

 

error_code =LV_SRE_StreamSetParameter(hport,STREAM_PARM_GRAMMAR_SET, LV_ACTIVE_GRAMMAR_SET);

}

void InitializePort()

{

int error_code;

 

hport = LV_SRE_OpenPort2(&error_code,NULL, NULL,0);

 

printf("Initializing the port.\n");

 

//Engine properties

error_code=LV_SRE_SetPropertyEx(hport,PROP_EX_CHOOSE_MODEL,PROP_EX_VALUE_TYPE_INT, (void*)1,PROP_EX_TARGET_CLIENT,VOICECHANNEL);

error_code=LV_SRE_SetPropertyEx(hport,PROP_EX_SRE_SERVERS,PROP_EX_VALUE_TYPE_STRING,"127.0.0.1:5730",PROP_EX_TARGET_CLIENT,VOICECHANNEL);

error_code=LV_SRE_SetPropertyEx(hport,PROP_EX_SAVE_SOUND_FILES,PROP_EX_VALUE_TYPE_INT, (void*)0,PROP_EX_TARGET_PORT,VOICECHANNEL);

error_code=LV_SRE_SetPropertyEx(hport,PROP_EX_NOISE_REDUCTION_ENABLE,PROP_EX_VALUE_TYPE_INT, (void*)1,PROP_EX_TARGET_CHANNEL,VOICECHANNEL);

error_code=LV_SRE_SetPropertyEx(hport,PROP_EX_NOISE_REDUCTION_ALPHA,PROP_EX_VALUE_TYPE_INT, (void*)85,PROP_EX_TARGET_CHANNEL,VOICECHANNEL);

error_code=LV_SRE_SetPropertyEx(hport,PROP_EX_NOISE_REDUCTION_AUTO_ADAPTIVE,PROP_EX_VALUE_TYPE_INT, (void*)1,PROP_EX_TARGET_CHANNEL,VOICECHANNEL);

 

//Frequency based Voice Activated Detection(VAD) parameteres

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_USE_FREQ_VAD, 1);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_DETECT_BARGE_IN, 1);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_DETECT_END_OF_SPEECH, 1);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_VOICE_CHANNEL, VOICECHANNEL);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_AUTO_DECODE, 1);

 

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_DECODE_FLAGS, LV_DECODE_SEMANTIC_INTERPRETATION);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_VAD_INIT_TIME, 100);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_VAD_BARGEIN_LVL, 30);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_VAD_EOS_DELAY, 800);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_VAD_NOISE_FLOOR, 150);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_VAD_WIND_BACK, 256);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_VAD_BURST_THLD, 100);

error_code=LV_SRE_StreamSetParameter(hport,STREAM_PARM_SOUND_FORMAT,ULAW_8KHZ);

LV_SRE_StreamSetStateChangeCallBack(hport, port_callback, NULL);

}

void main()

{

InitializePort();

 

LoadGrammar(grammar_label, grammar_file_path);

 

Audio_Stream(audio_file_path);

 

LV_SRE_ClosePort(hport);

}


Complete Help Topic List | Speech Engine Product Information