Example #1
0
int _tmain(int argc, _TCHAR* argv[])
{
	const char* grammar = NULL;
	const char* asrfile = get_audio_file();
	int ret = MSP_SUCCESS;
	//appid 请勿随意改动
	ret = QISRInit("appid=52d8f781");
	if(ret != MSP_SUCCESS)
	{
		printf("QISRInit with errorCode: %d \n", ret);
		return 0;
	}

	grammar = get_grammar( "gm_continuous_digit.abnf" );
	if(ret != MSP_SUCCESS)
	{
		printf("getExID with errorCode: %d \n", ret);
		return 0;
	}

	ret = run_asr(grammar , asrfile);
	release_grammar(&grammar);
	
	QISRFini();
	char key = _getch();
	return 0;
}
Example #2
0
static VALUE ifly_asr_iat(VALUE klass, VALUE fileName) {
  char *audioFileName = StringValue(fileName);

  int ret = 0, len, status = 2, ep_status = 0, rec_status = 0, rslt_status = 0, i = 0;
    char buff[kBufferSize], text[kBufferSize];
    FILE *fin;

    ret = QISRInit("appid=50ebc3c9,vad_enable=0");
    if (ret != 0) {
      rb_raise(rb_eRuntimeError, "ISR Initialize Error");
    }

    const char *sess_id = QISRSessionBegin("", "ssm=1,sub=iat,auf=audio/L16;rate=8000,aue=amr;-1,ent=sms8k,rst=plain,rse=utf8", &ret);

    if (ret != 0){
      rb_raise(rb_eRuntimeError, "ISR Session Begin Error");
    }

    fin = fopen(audioFileName, "rb");
    if (!fin) {
      rb_raise(rb_eRuntimeError, "ISR Can not open audio input file");
    }

    while(!feof(fin)) {
        len = fread(buff, 1, kBufferSize, fin);

        ret = QISRAudioWrite(sess_id, buff, len, status, &ep_status, &rec_status);

        if (ret != 0) break;

        usleep(200000);
    }
    fclose(fin);

    status = 4;
    ret = QISRAudioWrite(sess_id, buff, 1, status, &ep_status, &rec_status);
    if (ret != 0) {
      rb_raise(rb_eRuntimeError, "ISR Audio Last Frame Write Error");
    }

    do {
        const char *result = QISRGetResult(sess_id, &rslt_status, 0, &ret);
        if (ret != 0) break;
        if (rslt_status != 1 && result) strcat(text, result);
        usleep(500000);
    } while (rslt_status != 5 && ++i < 30);

    QISRSessionEnd(sess_id, NULL);
    QISRFini();

    return rb_str_new(text, strlen(text));
}
int main(int argc, char* argv[])
{
	int ret = MSP_SUCCESS;
	const char* param1 = "sub=iat,ssm=1,auf=audio/L16;rate=16000,aue=speex,ent=sms16k,rst=json,nbest=10";//最多5个候选项,格式只能为json,编码只能为utf8
	const char* param2 = "sub=iat,ssm=1,auf=audio/L16;rate=16000,aue=speex,ent=sms16k,rst=json,nbest=-1";//最多2个候选项,格式只能为json,编码只能为utf8,nbest的取值范围为1~5
	const char* output_file = "iat_result.txt";
	///引擎初始化,只需初始化一次
	///APPID请勿随意改动
	ret = QISRInit("appid=52f44528");

	//开始一路转写会话
	run_iat("wav/一二三四五六七八九十.wav" , output_file , param1);
	run_iat("wav/一二三四五六七八九十.wav" , output_file , param2);

	//逆初始化,在程序结束前调用一次即可
	ret = QISRFini();
	char key = getchar();
	return 0;
}
Example #4
0
void run_iat()
{
	bool error = false;
	int ret = MSP_SUCCESS;
	int i = 0;
	FILE* fp = NULL;
	FILE* fout = NULL;
	char buff[BUFFER_NUM];
	int len;
	int status = MSP_AUDIO_SAMPLE_CONTINUE, ep_status = -1, rec_status = -1, rslt_status = -1;
	///引擎初始化,只需初始化一次
	///APPID请勿随意改动
	ret = QISRInit("appid=510f2d72");

	///第二个参数为传递的参数,使用会话模式,使用speex编解码,使用16k16bit的音频数据
	///第三个参数为返回码
	const char* param = "sub=iat,ssm=1,auf=audio/L16;rate=16000,aue=speex,ent=sms16k,rst=plain";
	const char* sess_id = QISRSessionBegin(NULL, param, &ret);
	if ( MSP_SUCCESS != ret )
	{
		printf("QISRSessionBegin err %d\n", ret);	
		error = true;
	}

	///模拟录音,输入音频
	if (error == false)
	{
		fp = fopen("iat_demo_test.wav", "rb");
		if ( NULL == fp )
		{
			printf("failed to open file,please check the file.\n");
			error = true;
		}
	}

	///结果输出到文件
	if (error == false)
	{
		fout = fopen("iat_result.txt", "ab");
		if( NULL == fout )
		{
			printf("failed to open file,please check the file.\n");
			error = true;
		}
	}
	if (error == false)
	{
		printf("writing audio...\n");

		char param_value[32] = "";//参数值的字符串形式
		size_t value_len = 32;	//字符串长度或buffer长度
		int volume = 0;//音量数值

		while ( !feof(fp) )
		{
			len = fread(buff, 1, BUFFER_NUM, fp);
			printf(".");
			///开始向服务器发送音频数据
			ret = QISRAudioWrite(sess_id, buff, len, status, &ep_status, &rec_status);
			if ( ret != MSP_SUCCESS )
			{
				printf("\nQISRAudioWrite err %d\n", ret);
				error = true;
				break;
			}
			/*********获取当前发送音频的音量信息**********/
			value_len = 32;//value_len既是传入参数,又是传出参数,每次调用QTTSGetParam时要调整为buffer长度
			ret = QISRGetParam(sess_id,"volume",param_value,&value_len);//获取音量信息,获取上行流量和下行流量的例子见ttsdemo
			if ( ret != MSP_SUCCESS )
			{
				printf("QISRGetParam: qisr get param failed Error code %d.\n",ret);
				char key = _getch();
				break;
			}
			volume = atoi(param_value);//获取到的音量信息可以用于在界面上用不同的图片展示动态效果
			//printf("volume== %d \n",volume);
			for (int i=0;i<volume;i++)
			{
				printf(".");
			}
			printf("\n");
			/*******获取当前发送音频的音量信息结束**********/
			if (ep_status == MSP_EP_AFTER_SPEECH)//检测到音频后端点
			{
				printf("QISRAudioWrite: ep_status == MSP_EP_AFTER_SPEECH.\n");
				break;
			}
			
			///服务器返回部分结果
			if ( rec_status == MSP_REC_STATUS_SUCCESS )
			{
				const char* result = QISRGetResult(sess_id, &rslt_status, 0, &ret);
				if( rslt_status == MSP_REC_STATUS_NO_MATCH )
					printf("get result nomatch\n");
				else
				{
					if ( result != NULL )
						fwrite(result, 1, strlen(result), fout);
					printf("get result[%d/%d]: %s\n", ret, rslt_status, result);
				}
			}
			Sleep(200);
		}
		printf("\n");
		fclose(fp); 
	}

	///最后一块数据
	if (error == false)
	{	
		status = MSP_AUDIO_SAMPLE_LAST;
		ret = QISRAudioWrite(sess_id, buff, 1, status, &ep_status, &rec_status);
		if ( ret != MSP_SUCCESS )
		{
			printf("QISRAudioWrite write last audio err %d\n", ret);
			error = true;
		}
	}

	///最后一块数据发完之后,循环从服务器端获取结果
	///考虑到网络环境不好的情况下,需要对循环次数作限定
	if (error == false)
	{	
		printf("get reuslt\n");
		int loop_count = 0;
		do 
		{
			const char* result = QISRGetResult(sess_id, &rslt_status, 0, &ret);
			if ( ret != MSP_SUCCESS )
			{
				printf("QISRGetResult err %d\n", ret);
				error = true;
				break;
			}

			if( rslt_status == MSP_REC_STATUS_NO_MATCH )
				printf("get result nomatch\n");
			else
			{
				if ( result != NULL )
					fwrite(result, 1, strlen(result), fout);
				printf("[%d]:get result[%d/%d]: %s\n", (loop_count), ret, rslt_status, result);
			}
			Sleep(500);
		} while (rslt_status != MSP_REC_STATUS_COMPLETE && loop_count++ < 30);
	}

	if( NULL != fout )
	{
		fclose(fout);
	}

	ret = QISRSessionEnd(sess_id, NULL);
	if ( ret != MSP_SUCCESS )
	{
		printf("QISRSessionEnd err %d\n", ret);
		return;
	}
	printf("QISRSessionEnd.\n");

	ret = QISRFini();

	return;
}