リアルタイム音声変換文字+自動修正+意味理解

4602 ワード

効果:
 
音声の意味は結果の解析を返します:
	//          ,                ,       
	
	case AIUIConstant::EVENT_RESULT:
	{
		Json::Value bizParamJson;
		Json::Reader reader;

		if (!reader.parse(event.getInfo(), bizParamJson, false)) {
			cout << "parse error!" << endl << event.getInfo() << endl;
			break;
		}
		Json::Value data = (bizParamJson["data"])[0];
		Json::Value params = data["params"];
		Json::Value content = (data["content"])[0];
		string sub = params["sub"].asString();
		if (sub == "nlp")
		{
			Json::Value empty;
			Json::Value contentId = content.get("cnt_id", empty);

			if (contentId.empty())
			{
				cout << "Content Id is empty" << endl;
				break;
			}
			string cnt_id = contentId.asString();
			int dataLen = 0;
			const char* buffer = event.getData()->getBinary(cnt_id.c_str(), &dataLen);
			string resultStr;

			if (NULL != buffer)
			{
				resultStr = string(buffer, dataLen);
				QString res = QString::fromUtf8(buffer);
				//        QJsonDocument         
				QJsonParseError jsonError;
				QJsonDocument json = QJsonDocument::fromJson(res.toUtf8(), &jsonError);
				QString errstring = jsonError.errorString();
				if (jsonError.error == QJsonParseError::NoError)
				{
					if (json.isObject())
					{
						QJsonObject rootObj = json.object();
						QString rootpath;
						int rootusernum;
						//    key  rootpath
						if (rootObj.contains("intent"))
						{
							QJsonObject jonsInt = rootObj.value("intent").toObject();
							if (jonsInt.contains("answer"))
							{
								QJsonObject jonsAns = jonsInt.value("answer").toObject();
								QString value = jonsAns.value("text").toString();
								emit updateMsg(value);
							}
						}
					}
				}
			}
		}

JSON結果解析:
QList lstResult;
QString completeWorld;
void iat_online_record_sample::on_result(const char *result, char is_last)
{
	int islast = (int)is_last;

	QString mresult = QString::fromUtf8(result);
	QJsonParseError jsonError;
	QJsonDocument json = QJsonDocument::fromJson(mresult.toUtf8(), &jsonError);
	QString errstring = jsonError.errorString();
	if (jsonError.error == QJsonParseError::NoError)
	{
		if (json.isObject())
		{
			QJsonObject rootObj = json.object();

			if (rootObj.contains("ws"))
			{
				QJsonArray wsArray = rootObj.value("ws").toArray();
				int isize = wsArray.size();
				QString strResult;
				//       strResult
				for (int i = 0; i < isize; i++)
				{
					QJsonObject values = wsArray.at(i).toObject();
					if (values.contains("cw"))
					{
						QJsonArray cwArray = values.value("cw").toArray();
						QJsonObject cwObject = cwArray.at(0).toObject();
						if (cwObject.contains("w"))
						{
							strResult += cwObject.value("w").toString();
						}
					}
				}
				QString pgss = rootObj.value("pgs").toString();
				//               
				if (pgss == "apd")
				{
					if (lstResult.size() == 0)
					{
						m_this->updateResult(strResult, islast);
						lstResult.append(strResult);//       
					}
					else
					{
						//  
						QString delRe;
						QString upRe;
						QList only1 = lstResult;
						if (only1.size() > 0)
						{
							delRe = only1.at(0);
							upRe = delRe;
						}
						for (int j = 0; j < only1.size(); j++)
						{
							if (delRe == only1.at(j))
							{
								continue;
							}
							else
							{
								upRe += only1.at(j);
								delRe = only1.at(j);
							}
						}
						m_this->updateResult(upRe + strResult, islast);
						lstResult.append(strResult);//       
					}
				}
				//         ,     rg  
				if (pgss == "rpl")
				{
					lstResult.append(strResult);//       
					QJsonArray array = rootObj.value("rg").toArray();
					int iStart = array.at(0).toInt();
					int iEnd = array.at(1).toInt();
					for (int j = iStart - 1; j < iEnd; j++)
					{
						lstResult[j ] = strResult;
					}
					//  
					QString delRe;
					QString upRe;
					QList only1 = lstResult;
					if (only1.size() > 0)
					{
						delRe = only1.at(0);
						upRe = delRe;
					}
					for (int j = 0; j < only1.size(); j++)
					{
						if (delRe == only1.at(j))
						{
							continue;
						}
						else
						{
							upRe += only1.at(j);
							delRe = only1.at(j);
						}
					}
					m_this->updateResult(upRe, islast);
				}
			}
		}
	}
}