Megaphone_TTS.c 6.4 KB
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <malloc.h>

#include "Megaphone_TTS.h"
#include "cn_tts/cn_tts.h"
#include "JZsdkLib.h"
#include "Intl_tts/Intl_tts.h"

#include "version_choose.h"

static int g_Megaphone_TTS_tone = 0x01;
static int g_Megaphone_TTS_volue = 100;
static int g_Megaphone_TTS_speed = 0x32;

int tts_add = 0x00;

struct t_Megaphone_tts_param
{
	int tts_tone;		//喊话器音色
	int tts_volume;		//tts原音量
	int tts_speed;		//喊话速度
	int tts_ReplyFlag;   //是否需要回复
	char ttsdata[1024]; //tts数据
};


int TTS_Compound_flag=0;//默认是0     //TTS 标志



static void *TTS_flie(void *arg);
static int TTS(int name,int volume,int speed,int len,char *data, int ReplyFlag);//文本播放UTF-8,name发音人默认name==1;volume合成音量默认合成音量100;speed语速默认speed==50;argv文本内容。


/*********
 * 
 *  TTS初始化
 * 
 * *********/
T_JZsdkReturnCode TTS_Init()
{
    //讯飞初始化
    login_tts();

#if FIRMWARE_ORIGIN == OVERSEAS_VERSION 
	//海外版初始化
	espeak_init();
#endif

}



/*********
 * 
 *  TTS设置音色
 * 
 * *********/
T_JZsdkReturnCode TTS_SetTone(int tone)
{
	switch (tone)
	{
		case 0x01:
			printf("tts设置为 中文女声\n");
		break;
		
		case 0x02:
			printf("tts设置为 中文男声\n");
		break;
		
		case 0x11:
			printf("tts设置为 英文女声\n");
		break;

		case 0x12:
			printf("tts设置为 英文男声\n");
		break;

#if FIRMWARE_ORIGIN ==  DOMESTIC_VERSION   //国内版才有方言

		case 0x31:
        	printf("tts设置为 东北话\n");
        break;
            
		case 0x32:
			printf("tts设置为 四川话\n");
			break;
				
		case 0x33:
			printf("tts设置为 河南话\n");
			break;
				
		case 0x34:
			printf("tts设置为 湖南话\n");
			break;
				
		case 0x35:
			printf("tts设置为 陕西话\n");
			break;
				
		case 0x36:
			printf("tts设置为 广东话\n");
			break;

#elif FIRMWARE_ORIGIN == OVERSEAS_VERSION   //海外版才有其他国家的语音

		case 0x41://俄 russian ru
			printf("tts设置为 俄语\n");
		break;
		
		case 0x42://法 french fr-fr      
			printf("tts设置为 法语\n");
		break;
		
		case 0x43://德 german de        
			printf("tts设置为 德语\n");
		break;
		
		case 0x44://韩 ko      
			printf("tts设置为 韩语\n");
		break;
		
		case 0x45://意大利 italian it   
			printf("tts设置为 意大利语\n");
		break;
		
		case 0x46://波兰 polish pl       
			printf("tts设置为 波兰语\n");
		break;

		case 0x47://西班牙 spanish es
			printf("tts设置为 西班牙语\n");
		break;
		
		case 0x48://葡萄牙 portugal pt-pt    
			printf("葡萄牙语\n");
		break;

#endif

		default:
			printf("无效的tts设置\n");
			return JZ_ERRORCODE_TTS_INVALID_TONE;
        break;
	}	
		
	g_Megaphone_TTS_tone = tone;
	return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*********
 * 
 *  TTS设置语速
 * 
 * *********/
T_JZsdkReturnCode TTS_SetSpeed(int Speed)
{
	if ( (Speed < 0) || (Speed > 100) )
	{
		printf("TTS语速超出范围\n");
		return JZ_ERRORCODE_TTS_INVALID_SPEED;
	}
	
	printf("设置tts语速倍率为%d \n",Speed);
	g_Megaphone_TTS_speed = Speed;
	return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;

}

T_JZsdkReturnCode TTS_SetAppendTone(int tone)
{
	if (tone == 0x00 || tone == 0x01 || tone == 0x02)
	{
		tts_add = tone;

		return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 
	}

	else
	{
		tts_add = 0x00;

		return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 
	}	
}

/*********
 * 
 *  TTS播放
 * 
 * *********/
int TTS_Play(int len, char *data,  int ReplyFlag)
{
	return TTS(g_Megaphone_TTS_tone, g_Megaphone_TTS_volue, g_Megaphone_TTS_speed, len, data, ReplyFlag);
}

static int TTS(int name,int volume,int speed,int len,char *data, int ReplyFlag)//文本播放UTF-8,name发音人默认name==1;volume合成音量默认合成音量100;speed语速默认speed==50;argv文本内容。
{
	if(name < 0x40) //中英文或者方言
	{
		pthread_t TTS_flie_task;
		pthread_attr_t task_attribute; //线程属性
		pthread_attr_init(&task_attribute);  //初始化线程属性
		pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED);      //设置线程属性

		//如果tts没有在合成线程标志
		if(TTS_Compound_flag==0)
		{
			//tts参数结构体
			struct t_Megaphone_tts_param *Megaphone_tts_param = (struct t_Megaphone_tts_param *)malloc(sizeof(struct t_Megaphone_tts_param));
			if(Megaphone_tts_param == NULL)//如果申请内存失败,malloc会返回一个NULl
			{
				printf("malloc use failure");
				return 1;//申请内存失败,错误退出
			}

			//清空参数
			memset (Megaphone_tts_param,0,sizeof(struct t_Megaphone_tts_param));

			//写入参数
			Megaphone_tts_param->tts_speed = speed;
			Megaphone_tts_param->tts_tone =  name;
			Megaphone_tts_param->tts_volume = volume;
			Megaphone_tts_param->tts_ReplyFlag = ReplyFlag;
			snprintf(Megaphone_tts_param->ttsdata,len+8,"%s", data);
			

			int tts_ret = pthread_create(&TTS_flie_task,&task_attribute,TTS_flie,(void *)Megaphone_tts_param);		//TTS线程
			if(tts_ret != 0)
			{
				printf("创建TTS线程失败!\n");
				return -1;
			}
		}
	}
	else if(name>0x40&&name<0x50)//外语
	{
#if FIRMWARE_ORIGIN == OVERSEAS_VERSION 
		espeak_tts(name,speed,data,len);
#endif
	}
}

//TTS合成线程
static void *TTS_flie(void *arg)
{
	//打开tts合成线程标志
	TTS_Compound_flag=1;

	struct t_Megaphone_tts_param *Megaphone_tts_param = (struct t_Megaphone_tts_param *) arg;

	//打开TTS播放标志
	Set_TTS_play_flag(1);

	//生成tts播放文件
	play_tts(Megaphone_tts_param->tts_tone, Megaphone_tts_param->tts_volume,  Megaphone_tts_param->tts_speed, Megaphone_tts_param->ttsdata, Megaphone_tts_param->tts_ReplyFlag);

	//释放掉结构体
	delayMs(1); //1ms
	free(Megaphone_tts_param);

	//打开tts合成线程标志
	TTS_Compound_flag=0;
}

/*********
 * 
 *  获取音色
 * 
 * 
**********/
int TTS_Get_tone()
{
	return g_Megaphone_TTS_tone;
}
/*********
 * 
 *  获取语速
 * 
 * 
**********/
int TTS_Get_speed()
{
	return g_Megaphone_TTS_speed;
}

/*********
 * 
 *  20、获取追加音色
 * 
 * 
**********/
int TTS_Get_TTS_AppendTone()
{

    return tts_add;

}