nlsCppSdk/framework/common/nlsClient.h (70 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 NLS_SDK_CLIENT_H
#define NLS_SDK_CLIENT_H
#ifdef _MSC_VER
#include <Windows.h>
#else
#include <pthread.h>
#endif
#include <string>
#include "nlsGlobal.h"
namespace AlibabaNls {
class NlsClientImpl;
class SpeechRecognizerRequest;
class SpeechTranscriberRequest;
class SpeechSynthesizerRequest;
class DialogAssistantRequest;
class FlowingSynthesizerRequest;
enum LogLevel { LogError = 1, LogWarning, LogInfo, LogDebug };
enum TtsVersion { ShortTts = 0, LongTts };
enum DaVersion { DaV1 = 0, DaV2 };
typedef void (*LogCallbackMethod)(const char*, int, const char*);
class NLS_SDK_CLIENT_EXPORT NlsClient {
public:
/**
* @brief 设置日志文件与存储路径
* @param logOutputFile 日志文件,绝对路径或者相对路径均可
若填写"log-transcriber",
则会在程序当前目录生成log-transcriber.log;
若填写"/home/XXX/NlsCppSdk/log-transcriber",
则会在/home/XXX/NlsCppSdk/下生成log-transcriber.log
* @param logLevel 日志级别,默认1
* (LogError : 1, LogWarning : 2, LogInfo : 3, LogDebug :
4)
* @param logFileSize 日志文件的大小,以MB为单位,默认为10MB;
* 如果日志文件内容的大小超过这个值,
* SDK会自动备份当前的日志文件,超过后会循环覆盖已有文件
* @param logFileNum 日志文件循环存储最大数,默认10个文件
* @param logCallback 日志推送的回调
* @return 成功则返回0; 失败返回负值, 详见NlsRetCode
*/
int setLogConfig(const char* logOutputFile, const LogLevel logLevel,
unsigned int logFileSize = 10, unsigned int logFileNum = 10,
LogCallbackMethod logCallback = NULL);
/**
* @brief 创建一句话识别对象
* @param sdkName SDK的命名, 涉及到运行平台和代码语言
* @param isLongConnection 是否启用长链接, 即stop后可继续start.
* 但是此模式容易因为长时间未操作被服务端超时断链, 请谨慎使用或尽量不使用.
* @return 成功返回speechRecognizerRequest对象,否则返回NULL
*/
SpeechRecognizerRequest* createRecognizerRequest(
const char* sdkName = "cpp", bool isLongConnection = false);
/**
* @brief 销毁一句话识别对象
* @param request createRecognizerRequest所建立的request对象
* @return
*/
void releaseRecognizerRequest(SpeechRecognizerRequest* request);
/**
* @brief 创建实时音频流识别对象
* @param sdkName SDK的命名, 涉及到运行平台和代码语言
* @param isLongConnection 是否启用长链接, 即stop后可继续start.
* 但是此模式容易因为长时间未操作被服务端超时断链, 请谨慎使用或尽量不使用.
* @return 成功返回SpeechTranscriberRequest对象,否则返回NULL
*/
SpeechTranscriberRequest* createTranscriberRequest(
const char* sdkName = "cpp", bool isLongConnection = false);
/**
* @brief 销毁实时音频流识别对象
* @param request createTranscriberRequest所建立的request对象
* @return
*/
void releaseTranscriberRequest(SpeechTranscriberRequest* request);
/**
* @brief 创建语音合成对象
* @param version tts类型
* @param sdkName SDK的命名, 涉及到运行平台和代码语言
* @param isLongConnection 是否启用长链接, 即stop后可继续start.
* 但是此模式容易因为长时间未操作被服务端超时断链, 请谨慎使用或尽量不使用.
* @return 成功则SpeechSynthesizerRequest对象,否则返回NULL
*/
SpeechSynthesizerRequest* createSynthesizerRequest(
TtsVersion version = ShortTts, const char* sdkName = "cpp",
bool isLongConnection = false);
/**
* @brief 销毁语音合成对象
* @param request createSynthesizerRequest所建立的request对象
* @return
*/
void releaseSynthesizerRequest(SpeechSynthesizerRequest* request);
/**
* @brief 创建语音助手对象
* @param version dialogAssistant类型
* @param sdkName SDK的命名, 涉及到运行平台和代码语言
* @param isLongConnection 是否启用长链接, 即stop后可继续start.
* 但是此模式容易因为长时间未操作被服务端超时断链, 请谨慎使用或尽量不使用.
* @return 成功则DialogAssistantRequest对象,否则返回NULL
*/
DialogAssistantRequest* createDialogAssistantRequest(
DaVersion version = DaV1, const char* sdkName = "cpp",
bool isLongConnection = false);
/**
* @brief 销毁语音助手对象
* @param request createDialogAssistantRequest所建立的request对象
* @return
*/
void releaseDialogAssistantRequest(DialogAssistantRequest* request);
/**
* @brief 创建流式文本输入语音合成对象
* @param sdkName SDK的命名, 涉及到运行平台和代码语言
* @param isLongConnection 是否启用长链接, 即stop后可继续start.
* 但是此模式容易因为长时间未操作被服务端超时断链, 请谨慎使用或尽量不使用.
* @return 成功则FlowingSynthesizerRequest对象,否则返回NULL
*/
FlowingSynthesizerRequest* createFlowingSynthesizerRequest(
const char* sdkName = "cpp", bool isLongConnection = false);
/**
* @brief 销毁流式文本输入语音合成对象
* @param request createFlowingSynthesizerRequest所建立的request对象
* @return
*/
void releaseFlowingSynthesizerRequest(FlowingSynthesizerRequest* request);
/**
* @brief 当前版本信息
* @return
*/
const char* getVersion();
/**
* @brief 设置套接口地址结构的类型,若调用则需要在startWorkThread之前
* @param aiFamily 套接口地址结构类型 AF_INET/AF_INET6/AF_UNSPEC
* AF_INET: 仅返回IPV4相关的地址信息
* AF_INET6: 仅返回IPV6相关的地址信息
* AF_UNSPEC:返回适合任何协议族的地址
* @return
*/
void setAddrInFamily(const char* aiFamily = "AF_INET");
/**
* @brief
* 跳过dns域名解析直接设置服务器ipv4地址,若调用则需要在startWorkThread之前
* @param ip ipv4的ip地址 比如106.15.83.44
* @return
*/
void setDirectHost(const char* ip);
/**
* @brief 是否使用系统的getaddrinfo接口, 替代libevent的域名解析, 默认false
* 若调用则需要在startWorkThread之前.
* 存在部分设备在设置了dns后仍然无法通过SDK的dns获取可用的IP,
* 可调用此接口启用系统的getaddrinfo来解决这个问题.
* @param enable 建议使用更加高效的libevent域名解析, 即默认false
* @return
*/
void setUseSysGetAddrInfo(bool enable);
/**
* @brief 设置同步调用模式的超时时间, 0则为关闭同步模式, 默认0,
* 此模式start()后收到服务端结果再return出去,
* stop()后收到close()回调再return出去.
* @param timeoutMs 大于0即使用同步模式, 但是同步模式会阻塞并发,
* 请尽量不要使用
* @return
*/
void setSyncCallTimeout(unsigned int timeoutMs);
/**
* @brief 设置每个域名URL的预连接池, 用于降低每次发起请求前的连接时间.
* 此设置会关闭已经设置的长链接模式. 如果听悟场景, 请尽量不要使用此模式.
* @param maxNumber 默认0表示不启用预连接池. 大于0即启用预连接池,
* 可有效降低首包延迟.
* @param timeoutMs 预连接池中每个链接超时时间, 单位毫秒,
* 超时后关闭链接重新开启新连接. 默认18000ms, 不超过23000ms. 建议用默认值,
* 太小会导致效率降低.
* @param requestTimeoutMs 预连接池中每个已经建连的交互请求的超时时间,
* 单位毫秒, 超时后关闭链接重新开启新连接并建立请求. 默认7000ms, 不超过8000ms.
* 建议用默认值, 太小会导致效率降低.
* @return
*/
void setPreconnectedPool(unsigned int maxNumber,
unsigned int timeoutMs = 18000,
unsigned int requestTimeoutMs = 7000);
/**
* @brief 待合成音频文本内容字符数
* @note 必选参数,需要传入UTF-8编码的文本内容
* 短文本语音合成模式下(默认), 支持一次性合成300字符以内的文字,
* 其中1个汉字、1个英文字母或1个标点均算作1个字符,
* 超过300个字符的内容将会报错(或者截断).
* 超过300个字符可考虑长文本语音合成, 详见官方文档.
* @param value 待合成文本字符串
* @return 返回字符数
*/
int calculateUtf8Chars(const char* value);
/**
* @brief 启动工作线程数量
* @param threadsNumber 启动工作线程数量,默认设置值为1. 工作线程数越大,
* 每个请求的处理延迟更低, 但CPU占用更高. 如何选择详见readme.md
* @return
*/
void startWorkThread(int threadsNumber = 1);
/**
* @brief NlsClient对象实例
* @param sslInitial 是否初始化openssl 线程安全,默认为true
* @return NlsClient对象
*/
static NlsClient* getInstance(bool sslInitial = true);
/**
* @brief 销毁NlsClient对象实例
* @note 进程退出时调用, 销毁NlsClient.
* @return
*/
static void releaseInstance();
#if defined(__linux__)
/**
* @brief 获取ip
* @param vipServerDomainList 地址服务器列表, port可以是80. eg:
* "123.123.123.123:80,124.124.124.124:81"
* @param targetDomain 服务域, 比如default.gateway.vipserver
* @param url 语音服务目标url
* @return 成功返回0, 失败返回-1
*/
static int vipServerListGetUrl(const std::string& vipServerDomainList,
const std::string& targetDomain,
std::string& url);
#endif
private:
enum NlsClientConstValue {
VipServerPort = 80,
};
NlsClient();
~NlsClient();
static NlsClient* _instance;
NlsClientImpl* _impl;
}; // class NLS_SDK_CLIENT_EXPORT NlsClient
} // namespace AlibabaNls
#endif // NLS_SDK_CLIENT_H