作者 ookk303

讯飞库优化

... ... @@ -478,7 +478,7 @@ static T_JZsdkReturnCode RecvDeal_RealTimeMP2_Limit_transmission(int Port, char
}
HalRecvDataLen += DataLen;
JZSDK_LOG_INFO("%s,MP2实时喊话定长制传输中 长度:%d 总长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen, HalRecvDataLen);
JZSDK_LOG_DEBUG("%s,MP2实时喊话定长制传输中 长度:%d 总长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen, HalRecvDataLen);
//传输数据接口
#ifdef MEGAPHONE_CONFIG_STATUS_ON
... ... @@ -1994,7 +1994,7 @@ static T_JZsdkReturnCode RecvDeal_TTS_Trans_LimitTransmission(int Port, char *ge
//2、记录已加载的长度
TTS_RecvBufferLen = TTS_RecvBufferLen + DataLen;
JZSDK_LOG_INFO("%s,tts定长传输中, 长度:%d 总长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen, TTS_RecvBufferLen);
JZSDK_LOG_DEBUG("%s,tts定长传输中, 长度:%d 总长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen, TTS_RecvBufferLen);
}
else
{
... ... @@ -2563,7 +2563,7 @@ static T_JZsdkReturnCode RecvDeal_Opus_RealTimeVoice_LimitTransmission(int Port,
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("%s,传输opus定长语音传输中 长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen);
JZSDK_LOG_DEBUG("%s,传输opus定长语音传输中 长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen);
//传输数据接口
#ifdef MEGAPHONE_CONFIG_STATUS_ON
... ...
... ... @@ -54,8 +54,8 @@ T_JZsdkReturnCode DeviceInfo_Init()
//设备信息自打印
//DeviceMessage_PrintDeviceInfo();
//设备属性初始化
Attribute_Init();
//设备属性初始化, 暂时不启用,可能对opus实时产生影响
//Attribute_Init();
//debug模式
DebugInfo_Init();
... ...
#include <fstream>
#include <assert.h>
#include <cstring>
#include <atomic>
#include <unistd.h>
#include <string>
// #include <fstream>
// #include <assert.h>
// #include <cstring>
// #include <atomic>
// #include <unistd.h>
// #include <string>
#include "JZsdkLib.h"
#include "version_choose.h"
// #include "JZsdkLib.h"
// #include "version_choose.h"
// #include "JZsdk_base/JZring/JZring.h"
#ifdef IFLAY_TTS_2_CONFIG_STATUS_ON
// #ifdef IFLAY_TTS_2_CONFIG_STATUS_ON
#include "aikit_biz_api.h"
#include "aikit_constant.h"
#include "aikit_biz_config.h"
#include "iflytek_tts.h"
#include "AudioDeal/AudioDeal.h"
#include "../../Megaphone.h"
#include "iflytek_tts.h"
// #include "aikit_biz_api.h"
// #include "aikit_constant.h"
// #include "aikit_biz_config.h"
// #include "iflytek_tts.h"
// #include "AudioDeal/AudioDeal.h"
// #include "../../Megaphone.h"
// #include "iflytek_tts.h"
using namespace std;
using namespace AIKIT;
// using namespace std;
// using namespace AIKIT;
static std::atomic_bool ttsFinished(false);
static const char *ABILITY = "e2e44feff";
static AIKIT_HANDLE *g_AikitHandle = nullptr; //合成句柄
// static std::atomic_bool ttsFinished(false);
// static const char *ABILITY = "e2e44feff";
// static AIKIT_HANDLE *g_AikitHandle = nullptr; //合成句柄
static int IflytekLib_2_StopTts();
// static int IflytekLib_2_StopTts();
static FILE *iflytts_fp = NULL;
#define IFLYTTS_FP_NAME "/root/tmp_tts_file.pcm"
// static FILE *iflytts_fp = NULL;
// #define IFLYTTS_FP_NAME "/root/tmp_tts_file.pcm"
void OnOutput(AIKIT_HANDLE* handle, const AIKIT_OutputData* output)
{
//检测数据生成标志位是否有关闭,如果有关闭,则主动关闭合成,并退出该事件
if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF)
{
IflytekLib_2_StopTts();
return;
}
// void OnOutput(AIKIT_HANDLE* handle, const AIKIT_OutputData* output)
// {
// //检测数据生成标志位是否有关闭,如果有关闭,则主动关闭合成,并退出该事件
// if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF)
// {
// IflytekLib_2_StopTts();
// return;
// }
//如果存在数据,则播放
if (output->node->value)
{
//生产的文本数据 output->node->value
//生产的数据长度 output->node->len
//char类型
//JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);
printf("生产了数据%d\n", output->node->len);
//将该数据发送到alsa播放器
//AudioDeal_PcmDataInput_TextSteam(16000, (unsigned char *)output->node->value, output->node->len);
if (iflytts_fp != NULL)
{
fwrite(output->node->value, sizeof(char), output->node->len, iflytts_fp);
fflush(iflytts_fp);
}
// //如果存在数据,则播放
// if (output->node->value)
// {
// //生产的文本数据 output->node->value
// //生产的数据长度 output->node->len
// //char类型
// //JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);
// printf("生产了数据%d\n", output->node->len);
// //将该数据发送到alsa播放器
// //AudioDeal_PcmDataInput_TextSteam(16000, (unsigned char *)output->node->value, output->node->len);
// if (iflytts_fp != NULL)
// {
// fwrite(output->node->value, sizeof(char), output->node->len, iflytts_fp);
// fflush(iflytts_fp);
// }
}
// }
}
// }
void OnEvent(AIKIT_HANDLE* handle, AIKIT_EVENT eventType, const AIKIT_OutputEvent* eventValue) {
if (eventType == AIKIT_Event_End) {
ttsFinished = true;
// void OnEvent(AIKIT_HANDLE* handle, AIKIT_EVENT eventType, const AIKIT_OutputEvent* eventValue) {
// if (eventType == AIKIT_Event_End) {
// ttsFinished = true;
JZSDK_LOG_INFO("合成完成");
}
}
// JZSDK_LOG_INFO("合成完成");
// }
// }
void OnError(AIKIT_HANDLE* handle, int32_t err, const char* desc) {
printf("OnError:%d\n", err);
// void OnError(AIKIT_HANDLE* handle, int32_t err, const char* desc) {
// printf("OnError:%d\n", err);
//报错
}
// //报错
// }
int IflytekLib_2_TextToTts(int language,
const char *TtsRole,
const char *text, int speed, int volume)
{
// int IflytekLib_2_TextToTts(int language,
// const char *TtsRole,
// const char *text, int speed, int volume)
// {
if (iflytts_fp != NULL)
{
JZSDK_LOG_ERROR("file %s is not closed\n", IFLYTTS_FP_NAME);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
// if (iflytts_fp != NULL)
// {
// JZSDK_LOG_ERROR("file %s is not closed\n", IFLYTTS_FP_NAME);
// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
// }
AIKIT_ParamBuilder* paramBuilder = nullptr;
AIKIT_DataBuilder* dataBuilder = nullptr;
AiText* aiText_raw = nullptr;
// AIKIT_ParamBuilder* paramBuilder = nullptr;
// AIKIT_DataBuilder* dataBuilder = nullptr;
// AiText* aiText_raw = nullptr;
// 重置完成标志
ttsFinished = false;
// // 重置完成标志
// ttsFinished = false;
paramBuilder = AIKIT_ParamBuilder::create();
paramBuilder->clear();
// 设置发音人
paramBuilder->param("vcn", TtsRole, strlen(TtsRole));
paramBuilder->param("vcnModel", TtsRole, strlen(TtsRole));
// 设置语种
paramBuilder->param("language", language);
// 设置文本编码
paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8"));
//语速
paramBuilder->param("speed",speed); //可选参数,默认为0
// paramBuilder = AIKIT_ParamBuilder::create();
// paramBuilder->clear();
// // 设置发音人
// paramBuilder->param("vcn", TtsRole, strlen(TtsRole));
// paramBuilder->param("vcnModel", TtsRole, strlen(TtsRole));
// // 设置语种
// paramBuilder->param("language", language);
// // 设置文本编码
// paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8"));
// //语速
// paramBuilder->param("speed",speed); //可选参数,默认为0
//音调
//paramBuilder->param("pitch",100); //可选参数,默认为0
// //音调
// //paramBuilder->param("pitch",100); //可选参数,默认为0
//声音
//paramBuilder->param("volume",100);//可选参数,默认为0
//打开临存文件
iflytts_fp = fopen(IFLYTTS_FP_NAME, "w+b");
if (iflytts_fp == NULL)
{
JZSDK_LOG_ERROR("open file %s failed\n", IFLYTTS_FP_NAME);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//JZSDK_LOG_DEBUG("TTS Role:%s Len:%d, Text:%s Len:%d, language:%d", TtsRole, strlen(TtsRole), text, strlen(text), language);
// //声音
// //paramBuilder->param("volume",100);//可选参数,默认为0
// //打开临存文件
// iflytts_fp = fopen(IFLYTTS_FP_NAME, "w+b");
// if (iflytts_fp == NULL)
// {
// JZSDK_LOG_ERROR("open file %s failed\n", IFLYTTS_FP_NAME);
// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
// }
// //JZSDK_LOG_DEBUG("TTS Role:%s Len:%d, Text:%s Len:%d, language:%d", TtsRole, strlen(TtsRole), text, strlen(text), language);
int ret = AIKIT_Start(ABILITY, AIKIT_Builder::build(paramBuilder), nullptr, &g_AikitHandle);
if(ret != 0) {
printf("AIKIT_Start failed: %d\n", ret);
goto exit;
}
dataBuilder = AIKIT_DataBuilder::create();
dataBuilder->clear();
//aiText_raw = AiText::get("text")->data(text.c_str(), text.length())->once()->valid();
aiText_raw = AiText::get("text")->data(text, strlen(text) )->once()->valid();
dataBuilder->payload(aiText_raw);
ret = AIKIT_Write(g_AikitHandle, AIKIT_Builder::build(dataBuilder));
if(ret != 0) {
printf("AIKIT_Write failed: %d\n", ret);
goto exit;
}
// 等待合成完成
while(!ttsFinished) {
usleep(1000);
}
JZSDK_LOG_DEBUG("合成完成,开始播放");
//将fp指针移到文件开头
fseek(iflytts_fp, 0, SEEK_SET);
//将数据导入播放器
unsigned char buffer[1024];
int len;
while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) != JZ_FLAGCODE_OFF)
{
len = fread(buffer, sizeof(char), 1024, iflytts_fp);
if (len <= 0)
{
JZSDK_LOG_DEBUG("已读取完毕\n");
break;
}
AudioDeal_PcmDataInput_TextSteam(16000, buffer, len);
}
JZSDK_LOG_INFO("播放完成");
// int ret = AIKIT_Start(ABILITY, AIKIT_Builder::build(paramBuilder), nullptr, &g_AikitHandle);
// if(ret != 0) {
// printf("AIKIT_Start failed: %d\n", ret);
// goto exit;
// }
// dataBuilder = AIKIT_DataBuilder::create();
// dataBuilder->clear();
// //aiText_raw = AiText::get("text")->data(text.c_str(), text.length())->once()->valid();
// aiText_raw = AiText::get("text")->data(text, strlen(text) )->once()->valid();
// dataBuilder->payload(aiText_raw);
// ret = AIKIT_Write(g_AikitHandle, AIKIT_Builder::build(dataBuilder));
// if(ret != 0) {
// printf("AIKIT_Write failed: %d\n", ret);
// goto exit;
// }
// // 等待合成完成
// while(!ttsFinished) {
// usleep(1000);
// }
// JZSDK_LOG_DEBUG("合成完成,开始播放");
// //将fp指针移到文件开头
// fseek(iflytts_fp, 0, SEEK_SET);
// //将数据导入播放器
// unsigned char buffer[1024];
// int len;
// while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) != JZ_FLAGCODE_OFF)
// {
// len = fread(buffer, sizeof(char), 1024, iflytts_fp);
// if (len <= 0)
// {
// JZSDK_LOG_DEBUG("已读取完毕\n");
// break;
// }
// AudioDeal_PcmDataInput_TextSteam(16000, buffer, len);
// }
// JZSDK_LOG_INFO("播放完成");
ret = AIKIT_End(g_AikitHandle);
// ret = AIKIT_End(g_AikitHandle);
exit:
if(paramBuilder != nullptr) {
delete paramBuilder;
}
if(dataBuilder != nullptr) {
delete dataBuilder;
}
// exit:
// if(paramBuilder != nullptr) {
// delete paramBuilder;
// }
// if(dataBuilder != nullptr) {
// delete dataBuilder;
// }
if (iflytts_fp != NULL)
{
fclose(iflytts_fp);
iflytts_fp = NULL;
}
// if (iflytts_fp != NULL)
// {
// fclose(iflytts_fp);
// iflytts_fp = NULL;
// }
return 0;
}
// return 0;
// }
... ... @@ -202,47 +203,117 @@ exit:
int IflytekLib_2_Init()
{
AIKIT_Configurator::builder()
.app()
.appID("03857dfd")
.apiSecret("OTA2OTEzMTVlOGYwMjllMmJkYzEwZGY5")
.apiKey("2b2c60f8a80b8cdfe45ae1058a25149a")
.workDir("/root/Iflytek_2")
.auth()
.authType(0)
.log()
.logLevel(LOG_LVL_OFF) //关闭日志打印
.logMode(LOG_STDOUT); //日志输出为控制台
int ret = AIKIT_Init();
if(ret != 0) {
printf("AIKIT_Init failed: %d\n", ret);
return -1;
}
// int IflytekLib_2_UnInit()
// {
// AIKIT_UnInit();
// return 0;
// }
// static int IflytekLib_2_StopTts()
// {
// AIKIT_OutputEvent eventData = {};
// if (g_AikitHandle != nullptr)
// {
// OnEvent(g_AikitHandle,AIKIT_Event_End,&eventData);
// }
AIKIT_Callbacks cbs = {OnOutput, OnEvent, OnError};
AIKIT_RegisterAbilityCallback(ABILITY, cbs);
return 0;
}
int IflytekLib_2_UnInit()
{
AIKIT_UnInit();
return 0;
}
static int IflytekLib_2_StopTts()
{
AIKIT_OutputEvent eventData = {};
if (g_AikitHandle != nullptr)
{
OnEvent(g_AikitHandle,AIKIT_Event_End,&eventData);
}
// return 0;
// }
// #define IFLYTEK_RING_BUF_SIZE (1024 * 100) // 100KB缓冲区
// static T_JZringHandle g_ringHandle = nullptr;
// static char *g_ringBuf = nullptr;
// static int g_AudioPlayFinshFlag = JZ_FLAGCODE_OFF;
// static int g_playThreadRunning = JZ_FLAGCODE_OFF;
// static void PlaybackThreadFunc()
// {
// T_JZsdkOsalHandler *osHandler = JZsdk_Platform_GetOsalHandler;
// U8_t buffer[2048]; // 每次读取2KB
// U32_t readSize = 0;
// T_JZsdkReturnCode ret;
// U32_t dataCount = 0;
// g_playThreadRunning = JZ_FLAGCODE_ON;
// while (g_playThreadRunning == JZ_FLAGCODE_ON)
// {
// //监测缓冲区是否有数据
// dataCount = 0;
// ret = JZring_GetDataCount(g_ringHandle, &dataCount);
// if (dataCount == 0)
// {
// //等候线程唤醒
// continue;
// }
// //读取数据
// ret = JZring_Read(g_ringHandle, buffer, sizeof(buffer), &readSize);
// if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
// {
// JZSDK_LOG_ERROR("读取环形缓冲区失败");
// break;
// }
// //写入音频播放器
// AudioDeal_PcmDataInput_TextSteam(16000, buffer, readSize);
// g_AudioPlayFinshFlag = JZ_FLAGCODE_ON;
// //检查
// }
// }
// T_JZsdkReturnCode IflytekLib_2_Init()
// {
// //初始化环形缓冲区
// g_ringBuf = new char[IFLYTEK_RING_BUF_SIZE];
// if (JZring_Init(&g_ringHandle, reinterpret_cast<U8_t*>(g_ringBuf), IFLYTEK_RING_BUF_SIZE)
// != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// JZSDK_LOG_ERROR("环形缓冲区初始化失败");
// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
// }
// T_JZsdkOsalHandler *osHandler = JZsdk_Platform_GetOsalHandler;
// T_JZTaskHandle taskhandle;
// osHandler->TaskCreate("IfytekLibPlay", PlaybackThreadFunc, 1024, NULL, &taskhandle);
// AIKIT_Configurator::builder()
// .app()
// .appID("03857dfd")
// .apiSecret("OTA2OTEzMTVlOGYwMjllMmJkYzEwZGY5")
// .apiKey("2b2c60f8a80b8cdfe45ae1058a25149a")
// .workDir("/root/Iflytek_2")
// .auth()
// .authType(0)
// .log()
// .logLevel(LOG_LVL_OFF) //关闭日志打印
// .logMode(LOG_STDOUT); //日志输出为控制台
// int ret = AIKIT_Init();
// if(ret != 0) {
// printf("AIKIT_Init failed: %d\n", ret);
// return -1;
// }
return 0;
}
// AIKIT_Callbacks cbs = {OnOutput, OnEvent, OnError};
// AIKIT_RegisterAbilityCallback(ABILITY, cbs);
// return 0;
// }
#endif
\ No newline at end of file
// #endif
\ No newline at end of file
... ...
... ... @@ -12,7 +12,7 @@
#include "version_choose.h"
#include "JZsdk_base/JZring/JZring.h"
#if 1
#ifdef IFLAY_TTS_2_CONFIG_STATUS_ON
#include "aikit_biz_api.h"
#include "aikit_constant.h"
... ... @@ -49,7 +49,7 @@ void PlaybackThreadFunc()
T_JZsdkReturnCode ret;
g_playThreadRunning = true;
while (g_playThreadRunning)
{
// 等待有数据可读
... ... @@ -58,7 +58,7 @@ void PlaybackThreadFunc()
U32_t dataCount = 0;
JZring_GetDataCount(g_ringHandle, &dataCount);
JZSDK_LOG_DEBUG("缓冲区数据量: %d", dataCount);
//JZSDK_LOG_DEBUG("缓冲区数据量: %d", dataCount);
if (dataCount == 0) {
// 等待最多100ms或通知
... ... @@ -68,8 +68,6 @@ void PlaybackThreadFunc()
}
g_AudioPlayFinshFlag = JZ_FLAGCODE_ON;
JZSDK_LOG_DEBUG("有数据可读");
// 从环形缓冲区读取数据
ret = JZring_Read(g_ringHandle, buffer, sizeof(buffer), &readSize);
... ... @@ -77,20 +75,11 @@ void PlaybackThreadFunc()
usleep(10000); // 10ms
continue;
}
JZSDK_LOG_DEBUG("输入数据进音频库");
// 发送到音频播放器
AudioDeal_PcmDataInput_TextSteam(16000, buffer, readSize);
g_AudioPlayFinshFlag = JZ_FLAGCODE_OFF;
JZSDK_LOG_DEBUG("音频库播放完毕");
// 检查是否需要停止播放
if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
break;
}
}
g_playThreadRunning = false;
... ... @@ -105,7 +94,7 @@ void OnOutput(AIKIT_HANDLE* handle, const AIKIT_OutputData* output)
}
if (output->node->value) {
JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);
//JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);
// 写入环形缓冲区
T_JZsdkReturnCode ret;
... ...
... ... @@ -35,6 +35,7 @@ static int IflytekLib_2_StopTts();
#define IFLYTEK_RING_BUF_SIZE (1024 * 100) // 100KB缓冲区
static T_JZringHandle g_ringHandle = nullptr;
static char *g_ringBuf = nullptr;
static int g_AudioPlayFinshFlag = JZ_FLAGCODE_OFF;
// 同步机制
static std::mutex g_mutex;
... ... @@ -48,14 +49,17 @@ void PlaybackThreadFunc()
T_JZsdkReturnCode ret;
g_playThreadRunning = true;
std::unique_lock<std::mutex> lock(g_mutex);
while (g_playThreadRunning)
{
// 等待有数据可读
{
std::unique_lock<std::mutex> lock(g_mutex);
U32_t dataCount = 0;
JZring_GetDataCount(g_ringHandle, &dataCount);
JZSDK_LOG_DEBUG("缓冲区数据量: %d", dataCount);
if (dataCount == 0) {
// 等待最多100ms或通知
... ... @@ -64,6 +68,8 @@ void PlaybackThreadFunc()
}
}
g_AudioPlayFinshFlag = JZ_FLAGCODE_ON;
JZSDK_LOG_DEBUG("有数据可读");
// 从环形缓冲区读取数据
... ... @@ -73,10 +79,14 @@ void PlaybackThreadFunc()
continue;
}
JZSDK_LOG_DEBUG("输入数据进音频库");
// 发送到音频播放器
AudioDeal_PcmDataInput_TextSteam(16000, buffer, readSize);
g_AudioPlayFinshFlag = JZ_FLAGCODE_OFF;
JZSDK_LOG_DEBUG("音频库播放完毕");
// 检查是否需要停止播放
if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
... ... @@ -187,13 +197,15 @@ int IflytekLib_2_TextToTts(int language,
}
// 等待合成完成或停止信号
while(!ttsFinished) {
while(!ttsFinished || g_AudioPlayFinshFlag == JZ_FLAGCODE_ON) {
if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
break;
}
usleep(10000); // 10ms
}
JZSDK_LOG_INFO("合成结束");
// 结束合成
ret = AIKIT_End(g_AikitHandle);
g_AikitHandle = nullptr;
... ...
... ... @@ -522,7 +522,7 @@ T_JZsdkReturnCode Opus_RealTimeVoice_WriteDataToLoop(unsigned char *buf,int leng
}
Opus_RealTimeRecvLenth += length;
JZSDK_LOG_DEBUG("opus实时传入,写入总长度为%d",Opus_RealTimeRecvLenth);
JZSDK_LOG_INFO("opus实时传入,写入总长度为%d",Opus_RealTimeRecvLenth);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...