nlsCppSdk/framework/common/nlsClient.cpp (266 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.
*/
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include "Config.h"
#include "SSLconnect.h"
#include "connectNode.h"
#include "da/dialogAssistantRequest.h"
#include "nlog.h"
#include "nlsClient.h"
#include "nlsClientImpl.h"
#include "nlsEventNetWork.h"
#include "nodeManager.h"
#include "sr/speechRecognizerRequest.h"
#include "st/speechTranscriberRequest.h"
#include "sy/speechSynthesizerRequest.h"
#include "text_utils.h"
#include "utility.h"
namespace AlibabaNls {
NlsClient *NlsClient::_instance = NULL; // new NlsClient();
#if defined(_MSC_VER)
static HANDLE _mtxNlsClient = CreateMutex(NULL, FALSE, NULL);
#else
static pthread_mutex_t _mtxNlsClient = PTHREAD_MUTEX_INITIALIZER;
#endif
NlsClient::NlsClient() : _impl(NULL) {}
NlsClient::~NlsClient() {}
NlsClient *NlsClient::getInstance(bool sslInitial) {
MUTEX_LOCK(_mtxNlsClient);
if (NULL == _instance) {
// init nlsClient
_instance = new NlsClient();
_instance->_impl = new NlsClientImpl(sslInitial);
LOG_INFO("New NlsClient attach client(%p) to instance(%p).", _instance,
_instance->_impl);
}
MUTEX_UNLOCK(_mtxNlsClient);
return _instance;
}
void NlsClient::releaseInstance() {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
LOG_INFO("Release NlsClient instance:%p.", _instance);
_instance->_impl->releaseInstanceImpl();
LOG_INFO("Release NlsClientImpl %p.", _instance->_impl);
delete _instance->_impl;
_instance->_impl = NULL;
LOG_INFO("Release NlsClient instance:%p.", _instance);
delete _instance;
_instance = NULL;
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
const char *NlsClient::getVersion() { return NLS_SDK_VERSION_STR; }
void NlsClient::setAddrInFamily(const char *aiFamily) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->setAddrInFamilyImpl(aiFamily);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
void NlsClient::setUseSysGetAddrInfo(bool enable) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->setUseSysGetAddrInfoImpl(enable);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
void NlsClient::setSyncCallTimeout(unsigned int timeout_ms) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->setSyncCallTimeoutImpl(timeout_ms);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
void NlsClient::setPreconnectedPool(unsigned int maxNumber,
unsigned int timeoutMs,
unsigned requestTimeoutMs) {
#ifdef ENABLE_PRECONNECTED_POOL
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->setPreconnectedPool(maxNumber, timeoutMs,
requestTimeoutMs);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
#endif
}
void NlsClient::setDirectHost(const char *ip) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->setDirectHostImpl(ip);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
int NlsClient::calculateUtf8Chars(const char *value) {
return utility::TextUtils::CharsCalculate(value);
}
void NlsClient::startWorkThread(int threadsNumber) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
LOG_INFO("NLS initialize with version %s",
utility::TextUtils::GetVersion().c_str());
LOG_INFO("NLS Git SHA %s", utility::TextUtils::GetGitCommitInfo());
_instance->_impl->startWorkThreadImpl(threadsNumber);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
int NlsClient::setLogConfig(const char *logOutputFile, const LogLevel logLevel,
unsigned int logFileSize, unsigned int logFileNum,
LogCallbackMethod logCallback) {
MUTEX_LOCK(_mtxNlsClient);
int result = -(EventClientEmpty);
if (_instance) {
result = _instance->_impl->setLogConfigImpl(
logOutputFile, logLevel, logFileSize, logFileNum, logCallback);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
return result;
}
SpeechRecognizerRequest *NlsClient::createRecognizerRequest(
const char *sdkName, bool isLongConnection) {
MUTEX_LOCK(_mtxNlsClient);
SpeechRecognizerRequest *request = NULL;
if (_instance) {
request = _instance->_impl->createRecognizerRequestImpl(sdkName,
isLongConnection);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
return request;
}
void NlsClient::releaseRecognizerRequest(SpeechRecognizerRequest *request) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->releaseRecognizerRequestImpl(request);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
SpeechTranscriberRequest *NlsClient::createTranscriberRequest(
const char *sdkName, bool isLongConnection) {
MUTEX_LOCK(_mtxNlsClient);
SpeechTranscriberRequest *request = NULL;
if (_instance) {
request = _instance->_impl->createTranscriberRequestImpl(sdkName,
isLongConnection);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
return request;
}
void NlsClient::releaseTranscriberRequest(SpeechTranscriberRequest *request) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->releaseTranscriberRequestImpl(request);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
SpeechSynthesizerRequest *NlsClient::createSynthesizerRequest(
TtsVersion version, const char *sdkName, bool isLongConnection) {
MUTEX_LOCK(_mtxNlsClient);
SpeechSynthesizerRequest *request = NULL;
if (_instance) {
request = _instance->_impl->createSynthesizerRequestImpl(version, sdkName,
isLongConnection);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
return request;
}
void NlsClient::releaseSynthesizerRequest(SpeechSynthesizerRequest *request) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->releaseSynthesizerRequestImpl(request);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
DialogAssistantRequest *NlsClient::createDialogAssistantRequest(
DaVersion version, const char *sdkName, bool isLongConnection) {
MUTEX_LOCK(_mtxNlsClient);
DialogAssistantRequest *request = NULL;
if (_instance) {
request = _instance->_impl->createDialogAssistantRequestImpl(
version, sdkName, isLongConnection);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
return request;
}
void NlsClient::releaseDialogAssistantRequest(DialogAssistantRequest *request) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->releaseDialogAssistantRequestImpl(request);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
FlowingSynthesizerRequest *NlsClient::createFlowingSynthesizerRequest(
const char *sdkName, bool isLongConnection) {
MUTEX_LOCK(_mtxNlsClient);
FlowingSynthesizerRequest *request = NULL;
if (_instance) {
request = _instance->_impl->createFlowingSynthesizerRequestImpl(
sdkName, isLongConnection);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
return request;
}
void NlsClient::releaseFlowingSynthesizerRequest(
FlowingSynthesizerRequest *request) {
MUTEX_LOCK(_mtxNlsClient);
if (_instance) {
_instance->_impl->releaseFlowingSynthesizerRequestImpl(request);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
}
#if defined(__linux__)
int NlsClient::vipServerListGetUrl(const std::string &vipServerDomainList,
const std::string &targetDomain,
std::string &url) {
#ifdef ENABLE_VIPSERVER
MUTEX_LOCK(_mtxNlsClient);
int result = -(EventClientEmpty);
if (_instance) {
result = _instance->_impl->vipServerListGetUrlImpl(vipServerDomainList,
targetDomain, url);
} else {
LOG_WARN("Current instance has released.");
}
MUTEX_UNLOCK(_mtxNlsClient);
return result;
#else
LOG_WARN("Donnot enable VipServer.");
#endif // ENABLE_VIPSERVER
return Success;
}
#endif
} // namespace AlibabaNls