192 lines
7.3 KiB
C
192 lines
7.3 KiB
C
|
|
/**
|
|||
|
|
* @file cm_demo_tts.c
|
|||
|
|
* @brief TTS接口
|
|||
|
|
* @copyright Copyright © 2021 China Mobile IOT. All rights reserved.
|
|||
|
|
* @author WangPeng
|
|||
|
|
* @date 2021/04/22
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "stdio.h"
|
|||
|
|
#include "string.h"
|
|||
|
|
#include "cm_tts.h"
|
|||
|
|
#include "cm_demo_tts.h"
|
|||
|
|
#include "cm_demo_uart.h"
|
|||
|
|
|
|||
|
|
//#define CM_LOCAL_TTS_SUPPORT //离线TTS支持,仅适用于支持TTS的SDK版本的模组型号
|
|||
|
|
|
|||
|
|
#ifdef CM_LOCAL_TTS_SUPPORT
|
|||
|
|
#include "cm_local_tts.h"
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
/* 在线TTS配置 */
|
|||
|
|
static char tts_url[32] = "http://aip.baidubce.com"; //仅支持百度"http://aip.baidubce.com"
|
|||
|
|
static char tts_apiKey[32] = "xxxxxxxxxxxxxxxxxxxxxxxx"; //用户配置
|
|||
|
|
static char tts_secretKey[64] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //用户配置
|
|||
|
|
|
|||
|
|
/* 在线TTS回调函数 */
|
|||
|
|
static void __cm_tts_callback(cm_tts_event_e event, void *param)
|
|||
|
|
{
|
|||
|
|
switch(event)
|
|||
|
|
{
|
|||
|
|
case CM_TTS_EVENT_SYNTH_DATA:
|
|||
|
|
case CM_TTS_EVENT_SYNTH_FAIL:
|
|||
|
|
case CM_TTS_EVENT_SYNTH_INTERRUPT:
|
|||
|
|
case CM_TTS_EVENT_SYNTH_FINISH:
|
|||
|
|
break;
|
|||
|
|
case CM_TTS_EVENT_PLAY_FAIL:
|
|||
|
|
cm_demo_printf("[TTS] [%s] CM_TTS_EVENT_PLAY_FAIL\n", (char *)param);
|
|||
|
|
break;
|
|||
|
|
case CM_TTS_EVENT_PLAY_INTERRUPT:
|
|||
|
|
cm_demo_printf("[TTS] [%s] CM_TTS_EVENT_PLAY_INTERRUPT\n", (char *)param);
|
|||
|
|
break;
|
|||
|
|
case CM_TTS_EVENT_PLAY_FINISH:
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#ifdef CM_LOCAL_TTS_SUPPORT
|
|||
|
|
/* 离线TTS回调函数 */
|
|||
|
|
static void __cm_local_tts_callback(cm_local_tts_event_e event, void *param)
|
|||
|
|
{
|
|||
|
|
switch(event)
|
|||
|
|
{
|
|||
|
|
case CM_LOCAL_TTS_EVENT_SYNTH_DATA:
|
|||
|
|
{
|
|||
|
|
//cm_local_tts_synth_data_t *data = (cm_local_tts_synth_data_t *)param;
|
|||
|
|
|
|||
|
|
//cm_demo_printf("[TTS] [%s] CM_LOCAL_TTS_EVENT_SYNTH_DATA [%d] \n", data->user, data->len); //打印log操作较费时
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case CM_LOCAL_TTS_EVENT_SYNTH_FAIL:
|
|||
|
|
case CM_LOCAL_TTS_EVENT_SYNTH_INTERRUPT:
|
|||
|
|
case CM_LOCAL_TTS_EVENT_SYNTH_FINISH:
|
|||
|
|
break;
|
|||
|
|
case CM_LOCAL_TTS_EVENT_PLAY_FAIL:
|
|||
|
|
cm_demo_printf("[TTS] [%s] CM_LOCAL_TTS_EVENT_PLAY_FAIL\n", (char *)param);
|
|||
|
|
break;
|
|||
|
|
case CM_LOCAL_TTS_EVENT_PLAY_INTERRUPT:
|
|||
|
|
cm_demo_printf("[TTS] [%s] CM_LOCAL_TTS_EVENT_PLAY_INTERRUPT\n", (char *)param);
|
|||
|
|
break;
|
|||
|
|
case CM_LOCAL_TTS_EVENT_PLAY_FINISH:
|
|||
|
|
cm_demo_printf("[TTS] [%s] CM_LOCAL_TTS_EVENT_PLAY_FINISH\n", (char *)param);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* UART口TTS功能调试使用示例
|
|||
|
|
* CM:TTS:INIT //初始化在线TTS配置
|
|||
|
|
* CM:TTS:PLAY //播放在线TTS语音
|
|||
|
|
* CM:TTS:LOCAL_INIT //初始化离线TTS配置
|
|||
|
|
* CM:TTS:LOCAL_SYNTH //转码离线TTS(中文文本-PCM数据)
|
|||
|
|
* CM:TTS:LOCAL_PLAY //播放离线TTS语音
|
|||
|
|
*
|
|||
|
|
* 注意:因仅部分型号支持离线TTS功能,编译demo版本时离线TTS默认不参与链接 \n
|
|||
|
|
* 在确保使用的模组型号支持离线TTS功能的情况下,需要使用本demo中的离线TTS功能,需要打开CM_LOCAL_TTS_SUPPORT宏
|
|||
|
|
*/
|
|||
|
|
void cm_test_tts(unsigned char **cmd,int len)
|
|||
|
|
{
|
|||
|
|
unsigned char operation[20] = {0};
|
|||
|
|
sprintf((char *)operation, "%s", cmd[2]);
|
|||
|
|
|
|||
|
|
if (0 == strcmp((const char *)operation, "INIT")) //在线TTS初始化
|
|||
|
|
{
|
|||
|
|
cm_tts_deinit();
|
|||
|
|
cm_tts_cfg_t cfg = {0};
|
|||
|
|
|
|||
|
|
cfg.speed = 5;
|
|||
|
|
cfg.volume = 9;
|
|||
|
|
cfg.encode = CM_TTS_ENCODE_TYPE_UTF8; //底层限制,仅可配置为CM_TTS_ENCODE_TYPE_UTF8,且该配置并不生效,实际使用百度在线TTS需使用urlencode格式编码
|
|||
|
|
cfg.rdn = CM_TTS_RDN_AUTO; //仅可配置为CM_TTS_RDN_AUTO
|
|||
|
|
cfg.pitch = CM_TTS_PITCH_5;
|
|||
|
|
cfg.voice = CM_TTS_VOICE_0;
|
|||
|
|
cfg.channel = CM_TTS_CHANNEL_2; //底层限制,仅可配置为CM_TTS_CHANNEL_2,且该配置并不生效,本平台仅一个音频输出通道
|
|||
|
|
cfg.url = tts_url; //仅支持百度在线TTS,配置其他URL不生效
|
|||
|
|
cfg.apiKey = tts_apiKey;
|
|||
|
|
cfg.secretKey = tts_secretKey;
|
|||
|
|
|
|||
|
|
if (0 == cm_tts_init(&cfg))
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS] init success");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS] init error\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (0 == strcmp((const char *)operation, "PLAY")) //在线TTS播放
|
|||
|
|
{
|
|||
|
|
/* 播放TTS,注意百度平台仅支持urlencode格式 */
|
|||
|
|
if (0 == cm_tts_play("%E7%99%BE%E5%BA%A6%E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%BB%8A%E5%A4%A9%E6%98%AF%E4%B8%AA%E5%A5%BD%E6%97%A5%E5%AD%90", \
|
|||
|
|
strlen("%E7%99%BE%E5%BA%A6%E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%BB%8A%E5%A4%A9%E6%98%AF%E4%B8%AA%E5%A5%BD%E6%97%A5%E5%AD%90"), __cm_tts_callback, "OpenCPU")) //播放TTS语音
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS]:cm_tts_play() success\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS]:cm_tts_play() fail\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#ifdef CM_LOCAL_TTS_SUPPORT
|
|||
|
|
else if (0 == strcmp((const char *)operation, "LOCAL_INIT")) //离线TTS初始化
|
|||
|
|
{
|
|||
|
|
cm_local_tts_deinit();
|
|||
|
|
|
|||
|
|
cm_local_tts_cfg_t cfg = {0};
|
|||
|
|
|
|||
|
|
cfg.speed = 5;
|
|||
|
|
cfg.volume = 5;
|
|||
|
|
cfg.encode = CM_LOCAL_TTS_ENCODE_TYPE_UTF8; //离线TTS仅支持UTF8格式
|
|||
|
|
cfg.digit = 0;
|
|||
|
|
|
|||
|
|
if (0 == cm_local_tts_init(&cfg))
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS] init:speed %d,volume %d,encode %d,digit %d\n" , cfg.speed, cfg.volume, cfg.encode, cfg.digit);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS] init error\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (0 == strcmp((const char *)operation, "LOCAL_SYNTH")) //离线TTS转码
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS]:cm_local_tts_synth() begin\n");
|
|||
|
|
|
|||
|
|
/* 转码TTS,离线TTS仅支持中文文本(不支持英文文本),且中文编码格式仅支持UTF8格式
|
|||
|
|
使用如下示例需注意转码的中文文本内容为UTF8格式(cm_demo_tts.c文件编码格式为UTF8时,才能按下述代码实现*/
|
|||
|
|
if (0 == cm_local_tts_synth("中文转码测试", strlen("中文转码测试"), __cm_local_tts_callback, "Chinese"))
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS]:cm_local_tts_synth() success\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS]:cm_local_tts_synth() fail\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (0 == strcmp((const char *)operation, "LOCAL_PLAY")) //离线TTS播放
|
|||
|
|
{
|
|||
|
|
/* 播放TTS,离线TTS仅支持中文文本播放(不支持英文文本播放),且中文编码格式仅支持UTF8格式
|
|||
|
|
使用如下示例需注意播放的中文文本内容为UTF8格式(cm_demo_tts.c文件编码格式为UTF8时,才能按下述代码实现*/
|
|||
|
|
if (0 == cm_local_tts_play("中文播放测试", strlen("中文播放测试"), __cm_local_tts_callback, "Chinese")) //播放TTS语音
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS]:cm_local_tts_play() success\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS]:cm_local_tts_play() fail\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cm_demo_printf("[TTS] Illegal operation\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|