iflytek_2.c 6.6 KB
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <pthread.h>

#include "../Megaphone_TTS.h"
#include "../../Megaphone.h"
#include "./iflytek_2.h"

#include "AudioDeal/AudioDeal.h"
#include "Megaphone/Volume/volume.h"

#include "JZsdkLib.h"
#include "version_choose.h"

#ifdef IFLAY_TTS_2_CONFIG_STATUS_ON

#include "iflytek_tts.h"

static T_JZsdkReturnCode IflyTek_2_Tts_Input(int language, char *Text, int speed, int volume)
{
    //1、将JZSDK的Language索引值转换为 IFLTEK2的语言索引值
    //2、将language转换为音色文件
    int IflyTek_language = 0;
    char role[20] = {0};

    switch (language)
    {
        case 0x01: // 中文女生
            IflyTek_language = 1;
            strcpy(role, "xiaoyan");
            break;
        
        case 0x02: // 中文男生
            IflyTek_language = 1;
            strcpy(role, "xiaofeng");
            break;

        case 0x11: // 英文女生
            IflyTek_language = 2;
            strcpy(role, "catherine");
            break;

        case 0x12: // 英文男生
            IflyTek_language = 2;
            strcpy(role, "john");
            break;

        case 0x31: // 东北
            IflyTek_language = 1;
            strcpy(role, "xiaoqian");
            break;

        case 0x32: // 四川
            IflyTek_language = 1;
            strcpy(role, "yezi");
            break;

        case 0x33: // 河南
            IflyTek_language = 1;
            strcpy(role, "xiaokun");
            break;
        case 0x34: // 湖南
            IflyTek_language = 1;
            strcpy(role, "xiaoqiang");
            break;

        /*case 35: // 陕西
            role = "xiaoying";
            break;
        */

		case 0x36: // 广东
            IflyTek_language = 12; // 粤语
            strcpy(role, "xiaomei");
            break;

		case 0x37: // 湖北
            IflyTek_language = 1;
            strcpy(role, "xiaowang");
            break;

		/*case 38: // 东北
            role = "xiaoqian";
            break;
		*/

        default: // 默认中文女生
            IflyTek_language = 1;
            strcpy(role, "xiaoyan");
            break;
    }

    IflytekLib_2_TextToTts(IflyTek_language, role, Text, speed, volume);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

static T_JZsdkReturnCode TTS_FILE_play(struct t_Megaphone_tts_param *Megaphone_tts_param)
{
	int tone = Megaphone_tts_param->tts_tone;
	int speed = Megaphone_tts_param->tts_speed;
	char *argv = Megaphone_tts_param->ttsdata;
	int ReplyFlag = Megaphone_tts_param->ReplyFlag;
	int tts_add_mode = Megaphone_tts_param->tts_add;
	int volume = Megaphone_tts_param->tts_volume;

	//开始合成音频
	int loop;
	int loop_interval;
	int addtone = 0x01;
	if (Megaphone_tts_param->tts_add == 1)
	{
		addtone = 0x01;
	}
	else if (Megaphone_tts_param->tts_add == 2)
	{
		addtone = 0x02;
	}
	
	do
	{
		//输入数据
		IflyTek_2_Tts_Input(tone, argv, speed, volume); 
		//如果开启了追加模式
		if(tts_add_mode == JZ_FLAGCODE_ON)
		{
			//追加合成音频
			IflyTek_2_Tts_Input(addtone, argv,  speed, volume); 
		}

		Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP, &loop);
		Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP_INTERVAL, &loop_interval);

		//循环播放延时
		while (loop_interval > 0 && (loop == JZ_FLAGCODE_ON) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
		{
			delayMs(50);
			loop_interval -= 50;
		}

	} while ((loop == JZ_FLAGCODE_ON) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON));
	
	return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

//TTS合成线程
static void *Play_cntts_pthread(void *arg)
{
	struct t_Megaphone_tts_param *Megaphone_tts_param = (struct t_Megaphone_tts_param *) arg;

	int ReplyFlag = Megaphone_tts_param->ReplyFlag;

	//设置标志位
	Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);
	Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);

	//广播状态开始
	if (ReplyFlag == JZ_FLAGCODE_ON)
	{
		Megaphone_status_Broadcast(AUDIO_PLAY_STATUS_TTS);
	}
	
	int amplifier = JZ_FLAGCODE_ON;
    Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);

	//修改tts前的音量
	Megaphone_SetVolume(0, 1);

	//生成tts播放文件
	TTS_FILE_play(Megaphone_tts_param);

	//释放掉结构体和标志位
	JZsdk_Free(Megaphone_tts_param);

	//恢复音量
	int audio_volume = Megaphone_GetUiVolume();
	Megaphone_SetVolume(audio_volume,0);

	amplifier = JZ_FLAGCODE_OFF;
    Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);

	Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
	Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);

	//广播关闭
	if (ReplyFlag == JZ_FLAGCODE_ON)
	{
		Megaphone_status_Broadcast(JZ_FLAGCODE_OFF);
	}

}

/*********
 * 
 *  讯飞TTS_播放函数
 * 
**********/
T_JZsdkReturnCode Iflytek_2_Play(unsigned char *str, unsigned int str_len, int ReplyFlag)
{
	//1、制造一个数据产生函数
	pthread_t TTS_flie_task;
	pthread_attr_t task_attribute; //线程属性
	pthread_attr_init(&task_attribute);  //初始化线程属性
	pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED);      //设置线程属性

	//tts参数结构体
	struct t_Megaphone_tts_param *Megaphone_tts_param = NULL;
	if(JZsdk_Malloc( (void **)&Megaphone_tts_param, sizeof(struct t_Megaphone_tts_param)) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)//如果申请内存失败,malloc会返回一个NULl
	{
		printf("malloc use failure");
		return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;//申请内存失败,错误退出
	}

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

	//写入参数
	Megaphone_tts_param->tts_speed = TTS_Get_speed();
	Megaphone_tts_param->tts_tone =  TTS_Get_tone();
	Megaphone_tts_param->tts_volume = TTS_Get_NormalVolume();
	Megaphone_tts_param->tts_add = TTS_Get_TTS_AppendTone();
	Megaphone_tts_param->ReplyFlag = ReplyFlag;
	memset(Megaphone_tts_param->ttsdata,0,sizeof(Megaphone_tts_param->ttsdata));
	memcpy(Megaphone_tts_param->ttsdata, str, str_len);

	int tts_ret = pthread_create(&TTS_flie_task,&task_attribute,Play_cntts_pthread,(void *)Megaphone_tts_param);		//TTS线程
	if(tts_ret != 0)
	{
		printf("创建TTS线程失败\n");
		return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
	}

	return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}



/*********
 * 
 *  tts初始化
 * 
**********/
T_JZsdkReturnCode Iflytek_2_Init()
{
    IflytekLib_2_Init();

	JZSDK_LOG_DEBUG("Iflytek_2_Init");

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/*******
 * 
 *  tts销毁
 * 
 * ********/
T_JZsdkReturnCode Iflytek_2_DeInit()
{
    IflytekLib_2_UnInit();

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

#endif