nlsCppSdk/framework/common/nlsEvent.cpp (528 lines of code) (raw):
/*
* Copyright 2021 Alibaba Group Holding Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "nlsEvent.h"
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include "json/json.h"
#include "nlog.h"
namespace AlibabaNls {
NlsEvent::NlsEvent()
: _statusCode(0),
_msg(""),
_msgType(TaskFailed),
_taskId(""),
_result(""),
_displayText(""),
_spokenText(""),
_sentenceTimeOutStatus(0),
_sentenceIndex(0),
_sentenceTime(0),
_sentenceBeginTime(0),
_sentenceConfidence(0.0),
_wakeWordAccepted(false),
_wakeWordKnown(false),
_wakeWordUserId(""),
_wakeWordGender(0),
_binaryDataInChar(NULL),
_binaryDataSize(0),
_stashResultSentenceId(0),
_stashResultBeginTime(0),
_stashResultText(""),
_stashResultCurrentTime(0) {}
NlsEvent::NlsEvent(const NlsEvent& ne) {
this->_statusCode = ne._statusCode;
this->_taskId = ne._taskId;
this->_result = ne._result;
this->_sentenceIndex = ne._sentenceIndex;
this->_sentenceTime = ne._sentenceTime;
this->_sentenceTimeOutStatus = ne._sentenceTimeOutStatus;
this->_msg = ne._msg;
this->_msgType = ne._msgType;
this->_binaryData = ne._binaryData;
this->_binaryDataInChar = ne._binaryDataInChar;
this->_binaryDataSize = ne._binaryDataSize;
this->_sentenceBeginTime = ne._sentenceBeginTime;
this->_sentenceConfidence = ne._sentenceConfidence;
this->_sentenceWordsList = ne._sentenceWordsList;
this->_stashResultSentenceId = ne._stashResultSentenceId;
this->_stashResultBeginTime = ne._stashResultBeginTime;
this->_stashResultCurrentTime = ne._stashResultCurrentTime;
this->_stashResultText = ne._stashResultText;
this->_wakeWordAccepted = false;
this->_wakeWordKnown = false;
this->_wakeWordGender = 0;
}
NlsEvent::NlsEvent(const char* msg, int code, EventType type,
std::string& taskId)
: _statusCode(code),
_msg(msg),
_msgType(type),
_taskId(taskId),
_result(""),
_displayText(""),
_spokenText(""),
_sentenceTimeOutStatus(0),
_sentenceIndex(0),
_sentenceTime(0),
_sentenceBeginTime(0),
_sentenceConfidence(0.0),
_wakeWordAccepted(false),
_wakeWordKnown(false),
_wakeWordUserId(""),
_wakeWordGender(0),
_binaryDataInChar(NULL),
_binaryDataSize(0),
_stashResultSentenceId(0),
_stashResultBeginTime(0),
_stashResultText(""),
_stashResultCurrentTime(0) {}
NlsEvent::NlsEvent(std::string& msg)
: _msg(msg),
_statusCode(Success),
_msgType(Message),
_taskId(""),
_result(""),
_displayText(""),
_spokenText(""),
_sentenceTimeOutStatus(0),
_sentenceIndex(0),
_sentenceTime(0),
_sentenceBeginTime(0),
_sentenceConfidence(0.0),
_wakeWordAccepted(false),
_wakeWordKnown(false),
_wakeWordUserId(""),
_wakeWordGender(0),
_binaryDataInChar(NULL),
_binaryDataSize(0),
_stashResultSentenceId(0),
_stashResultBeginTime(0),
_stashResultText(""),
_stashResultCurrentTime(0) {}
NlsEvent::NlsEvent(std::vector<unsigned char>& data, int code, EventType type,
std::string& taskId)
: _statusCode(code),
_msgType(type),
_taskId(taskId),
_binaryData(data),
_msg(""),
_result(""),
_displayText(""),
_spokenText(""),
_sentenceTimeOutStatus(0),
_sentenceIndex(0),
_sentenceTime(0),
_sentenceBeginTime(0),
_sentenceConfidence(0.0),
_wakeWordAccepted(false),
_wakeWordKnown(false),
_wakeWordUserId(""),
_wakeWordGender(0),
_binaryDataInChar(NULL),
_binaryDataSize(0),
_stashResultSentenceId(0),
_stashResultBeginTime(0),
_stashResultText(""),
_stashResultCurrentTime(0) {
// LOG_DEBUG("Binary data event:%d.", data.size());
}
NlsEvent::NlsEvent(unsigned char* data, int dataBytes, int code, EventType type,
std::string& taskId)
: _statusCode(code),
_msgType(type),
_taskId(taskId),
_binaryData(data, data + dataBytes),
_msg(""),
_result(""),
_displayText(""),
_spokenText(""),
_sentenceTimeOutStatus(0),
_sentenceIndex(0),
_sentenceTime(0),
_sentenceBeginTime(0),
_sentenceConfidence(0.0),
_wakeWordAccepted(false),
_wakeWordKnown(false),
_wakeWordUserId(""),
_wakeWordGender(0),
_binaryDataInChar(NULL),
_binaryDataSize(0),
_stashResultSentenceId(0),
_stashResultBeginTime(0),
_stashResultText(""),
_stashResultCurrentTime(0) {}
NlsEvent::~NlsEvent() {
if (_binaryDataInChar) {
free(_binaryDataInChar);
_binaryDataInChar = NULL;
_binaryDataSize = 0;
}
}
int NlsEvent::parseJsonMsg(bool ignore) {
if (_msg.empty()) {
return -(NlsEventMsgEmpty);
}
try {
Json::Reader reader;
Json::Value head(Json::objectValue);
Json::Value payload(Json::objectValue);
Json::Value root(Json::objectValue);
Json::Value stashResult(Json::objectValue);
if (!reader.parse(_msg, root)) {
LOG_ERROR("_msg:%s", _msg.c_str());
return -(JsonParseFailed);
}
// parse head
if (!root["header"].isNull() && root["header"].isObject()) {
head = root["header"];
// name
if (!head["name"].isNull() && head["name"].isString()) {
std::string name = head["name"].asCString();
int retCode = parseMsgType(name);
if (retCode < 0) {
if (ignore == false) {
if (retCode == -(InvalidNlsEventMsgType)) {
LOG_ERROR("Event Msg Type is invalid: %s", _msg.c_str());
return retCode;
}
}
}
}
// status
if (!head["status"].isNull() && head["status"].isInt()) {
_statusCode = head["status"].asInt();
} else {
if (ignore == false) {
return -(InvalidNlsEventMsgStatusCode);
}
}
// task_id
if (!head["task_id"].isNull() && head["task_id"].isString()) {
_taskId = head["task_id"].asCString();
}
} else {
if (!root["channelClosed"].isNull()) {
_msgType = Close;
} else if (!root["TaskFailed"].isNull()) {
_msgType = TaskFailed;
} else {
if (ignore == false) {
return -(InvalidNlsEventMsgHeader);
}
}
}
// parse payload
if (_msgType != SynthesisCompleted && _msgType != MetaInfo) {
if (!root["payload"].isNull() && root["payload"].isObject()) {
payload = root["payload"];
// result
if (!payload["result"].isNull() && payload["result"].isString()) {
_result = payload["result"].asCString();
}
// index
if (!payload["index"].isNull() && payload["index"].isInt()) {
_sentenceIndex = payload["index"].asInt();
}
// time
if (!payload["time"].isNull() && payload["time"].isInt()) {
_sentenceTime = payload["time"].asInt();
}
// begin_time
if (!payload["begin_time"].isNull() && payload["begin_time"].isInt()) {
_sentenceBeginTime = payload["begin_time"].asInt();
}
// confidence
if (!payload["confidence"].isNull() &&
payload["confidence"].isDouble()) {
_sentenceConfidence = payload["confidence"].asDouble();
}
// display_text
if (!payload["display_text"].isNull() &&
payload["display_text"].isString()) {
_displayText = payload["display_text"].asCString();
}
// spoken_text
if (!payload["spoken_text"].isNull() &&
payload["spoken_text"].isString()) {
_spokenText = payload["spoken_text"].asCString();
}
// sentence timeOut status
if (!payload["status"].isNull() && payload["status"].isInt()) {
_sentenceTimeOutStatus = payload["status"].asInt();
}
// example: "words":[{"text":"一二三四","startTime":810,"endTime":2460}]
if (!payload["words"].isNull() && payload["words"].isArray()) {
Json::Value wordArray = payload["words"];
int iSize = wordArray.size();
WordInfomation wordInfo;
for (int nIndex = 0; nIndex < iSize; nIndex++) {
if (wordArray[nIndex].isMember("text") &&
wordArray[nIndex]["text"].isString()) {
wordInfo.text = wordArray[nIndex]["text"].asCString();
}
if (wordArray[nIndex].isMember("startTime") &&
wordArray[nIndex]["startTime"].isInt()) {
wordInfo.startTime = wordArray[nIndex]["startTime"].asInt();
}
if (wordArray[nIndex].isMember("endTime") &&
wordArray[nIndex]["endTime"].isInt()) {
wordInfo.endTime = wordArray[nIndex]["endTime"].asInt();
}
// LOG_DEBUG("List Push: %s %d %d",
// wordInfo.text.c_str(), wordInfo.startTime, wordInfo.endTime);
_sentenceWordsList.push_back(wordInfo);
} // for
}
// WakeWordVerificationCompleted
if (_msgType == NlsEvent::WakeWordVerificationCompleted) {
if (!payload["accepted"].isNull() && payload["accepted"].isBool()) {
_wakeWordAccepted = payload["accepted"].asBool();
}
if (!payload["known"].isNull() && payload["known"].isBool()) {
_wakeWordKnown = payload["known"].asBool();
}
if (!payload["user_id"].isNull() && payload["user_id"].isString()) {
_wakeWordUserId = payload["user_id"].asCString();
}
if (!payload["gender"].isNull() && payload["gender"].isInt()) {
_wakeWordGender = payload["gender"].asInt();
}
}
// stashResult
if (_msgType == NlsEvent::SentenceEnd) {
if (!payload["stash_result"].isNull() &&
payload["stash_result"].isObject()) {
stashResult = payload["stash_result"];
if (!stashResult["sentenceId"].isNull() &&
stashResult["sentenceId"].isInt()) {
_stashResultSentenceId = stashResult["sentenceId"].asInt();
}
if (!stashResult["beginTime"].isNull() &&
stashResult["beginTime"].isInt()) {
_stashResultBeginTime = stashResult["beginTime"].asInt();
}
if (!stashResult["currentTime"].isNull() &&
stashResult["currentTime"].isInt()) {
_stashResultCurrentTime = stashResult["currentTime"].asInt();
}
if (!stashResult["text"].isNull() &&
stashResult["text"].isString()) {
_stashResultText = stashResult["text"].asCString();
}
}
}
}
}
} catch (const std::exception& e) {
LOG_ERROR("Json failed: %s", e.what());
return -(JsonParseFailed);
}
return Success;
}
int NlsEvent::parseMsgType(std::string name) {
if (name == "TaskFailed") {
_msgType = NlsEvent::TaskFailed;
} else if (name == "RecognitionStarted") {
_msgType = NlsEvent::RecognitionStarted;
} else if (name == "RecognitionCompleted") {
_msgType = NlsEvent::RecognitionCompleted;
} else if (name == "RecognitionResultChanged") {
_msgType = NlsEvent::RecognitionResultChanged;
} else if (name == "TranscriptionStarted") {
_msgType = NlsEvent::TranscriptionStarted;
} else if (name == "SentenceBegin") {
_msgType = NlsEvent::SentenceBegin;
} else if (name == "TranscriptionResultChanged") {
_msgType = NlsEvent::TranscriptionResultChanged;
} else if (name == "SentenceEnd") {
_msgType = NlsEvent::SentenceEnd;
} else if (name == "TranscriptionCompleted") {
_msgType = NlsEvent::TranscriptionCompleted;
} else if (name == "SynthesisStarted") {
_msgType = NlsEvent::SynthesisStarted;
} else if (name == "SynthesisCompleted") {
_msgType = NlsEvent::SynthesisCompleted;
} else if (name == "DialogResultGenerated") {
_msgType = NlsEvent::DialogResultGenerated;
} else if (name == "WakeWordVerificationCompleted") {
_msgType = NlsEvent::WakeWordVerificationCompleted;
} else if (name == "SentenceSemantics") {
_msgType = NlsEvent::SentenceSemantics;
} else if (name == "MetaInfo") {
_msgType = NlsEvent::MetaInfo;
} else if (name == "SentenceSynthesis") {
_msgType = NlsEvent::SentenceSynthesis;
} else {
// LOG_ERROR("EVENT: type is invalid. [%s].", _msg.c_str());
return -(InvalidNlsEventMsgType);
}
return Success;
}
int NlsEvent::getStatusCode() { return _statusCode; }
const char* NlsEvent::getAllResponse() {
if (this->getMsgType() == Binary) {
// LOG_DEBUG("this is Binary data.");
}
return this->_msg.c_str();
}
const char* NlsEvent::getErrorMessage() {
if (_msgType != TaskFailed) {
LOG_DEBUG("this msg is not error msg.");
return "";
}
return this->_msg.c_str();
}
NlsEvent::EventType NlsEvent::getMsgType() { return _msgType; }
std::string NlsEvent::getMsgTypeString(int type) {
std::string ret_str = "Unknown";
NlsEvent::EventType msg_type =
(type >= 0) ? (NlsEvent::EventType)type : _msgType;
switch (msg_type) {
case TaskFailed:
ret_str.assign("TaskFailed");
break;
case RecognitionStarted:
ret_str.assign("RecognitionStarted");
break;
case RecognitionCompleted:
ret_str.assign("RecognitionCompleted");
break;
case RecognitionResultChanged:
ret_str.assign("RecognitionResultChanged");
break;
case WakeWordVerificationCompleted:
ret_str.assign("WakeWordVerificationCompleted");
break;
case TranscriptionStarted:
ret_str.assign("TranscriptionStarted");
break;
case SentenceBegin:
ret_str.assign("SentenceBegin");
break;
case TranscriptionResultChanged:
ret_str.assign("TranscriptionResultChanged");
break;
case SentenceEnd:
ret_str.assign("SentenceEnd");
break;
case SentenceSemantics:
ret_str.assign("SentenceSemantics");
break;
case TranscriptionCompleted:
ret_str.assign("TranscriptionCompleted");
break;
case SynthesisStarted:
ret_str.assign("SynthesisStarted");
break;
case SynthesisCompleted:
ret_str.assign("SynthesisCompleted");
break;
case Binary:
ret_str.assign("Binary");
break;
case MetaInfo:
ret_str.assign("MetaInfo");
break;
case DialogResultGenerated:
ret_str.assign("DialogResultGenerated");
break;
case Close:
ret_str.assign("Close");
break;
case Message:
ret_str.assign("Message");
break;
case SentenceSynthesis:
ret_str.assign("SentenceSynthesis");
break;
}
return ret_str;
}
const char* NlsEvent::getTaskId() { return _taskId.c_str(); }
const char* NlsEvent::getDisplayText() { return _displayText.c_str(); }
const char* NlsEvent::getSpokenText() { return _spokenText.c_str(); }
const char* NlsEvent::getResult() {
if (_msgType != RecognitionResultChanged &&
_msgType != RecognitionCompleted &&
_msgType != TranscriptionResultChanged && _msgType != SentenceEnd) {
return NULL;
}
return _result.c_str();
}
int NlsEvent::getSentenceIndex() {
if (_msgType != SentenceBegin && _msgType != SentenceEnd &&
_msgType != TranscriptionResultChanged) {
return -(InvalidNlsEventMsgType);
}
return _sentenceIndex;
}
int NlsEvent::getSentenceTime() {
if (_msgType != SentenceBegin && _msgType != SentenceEnd &&
_msgType != TranscriptionResultChanged) {
return -(InvalidNlsEventMsgType);
}
return _sentenceTime;
}
int NlsEvent::getSentenceBeginTime() {
if (_msgType != SentenceEnd) {
return -(InvalidNlsEventMsgType);
}
return _sentenceBeginTime;
}
double NlsEvent::getSentenceConfidence() {
if (_msgType != SentenceEnd) {
return -(InvalidNlsEventMsgType);
}
return _sentenceConfidence;
}
int NlsEvent::getSentenceTimeOutStatus() {
if (_msgType != SentenceEnd) {
return -(InvalidNlsEventMsgType);
}
return _sentenceTimeOutStatus;
}
std::list<WordInfomation> NlsEvent::getSentenceWordsList() {
std::list<WordInfomation> tmpList;
if (_msgType != SentenceEnd) {
return tmpList;
}
return _sentenceWordsList;
}
std::vector<unsigned char> NlsEvent::getBinaryData() {
if (getMsgType() == Binary) {
return _binaryData;
} else {
LOG_WARN("this hasn't Binary data.");
return _binaryData;
}
}
unsigned char* NlsEvent::getBinaryDataInChar() {
if (getMsgType() == Binary) {
if (_binaryDataInChar) {
free(_binaryDataInChar);
}
_binaryDataSize = _binaryData.size();
_binaryDataInChar = (unsigned char*)malloc(_binaryDataSize);
memcpy(_binaryDataInChar, _binaryData.data(), _binaryDataSize);
return _binaryDataInChar;
} else {
LOG_WARN("this hasn't Binary data.");
return NULL;
}
}
unsigned int NlsEvent::getBinaryDataSize() {
if (getMsgType() == Binary) {
return _binaryData.size();
} else {
return 0;
}
}
bool NlsEvent::getWakeWordAccepted() {
if (_msgType != WakeWordVerificationCompleted) {
return false;
}
return _wakeWordAccepted;
}
int NlsEvent::getStashResultSentenceId() {
if (_msgType != SentenceEnd) {
return -(InvalidNlsEventMsgType);
}
return _stashResultSentenceId;
}
int NlsEvent::getStashResultBeginTime() {
if (_msgType != SentenceEnd) {
return -(InvalidNlsEventMsgType);
}
return _stashResultBeginTime;
}
int NlsEvent::getStashResultCurrentTime() {
if (_msgType != SentenceEnd) {
return -(InvalidNlsEventMsgType);
}
return _stashResultCurrentTime;
}
const char* NlsEvent::getStashResultText() {
if (_msgType != SentenceEnd) {
return NULL;
}
return _stashResultText.c_str();
}
} // namespace AlibabaNls