自定义语音

更新时间:2023-12-25 07:16:52下载pdf

自定义语音具有丰富的应用场景,需要与 App 配合使用,设备端可获取并下载提前录制的语音。

技术原理

下载云端录音列表中的语音资源,然后保存至设备中。涉及从云端获取语音文件信息列表和下载语音文件操作,需要与 App 和云端进行交互。

相关文件

tuya_ipc_voice.h

数据结构

该功能使用到以下数据结构:

语音列表

typedef struct
{
    BOOL_T valid;
    BOOL_T isPreset;
    CHAR_T name[VOICE_NAME_LEN+1];
    CHAR_T filename[VOICE_FILENAME_LEN+1];
    INT_T  id;
    UINT_T size;
    UINT_T duration;
} VOICE_LIST_S;

语音文件下载回调

/**
 * \brief callback to process downloading voice data
 * \param[in] data is voice data
 * \param[in] len is voice data length
 * \param[in] pri_data is pointer set in tuya_ipc_voice_download_start api
 * \return OPERATE_RET
 */
typedef OPERATE_RET (*GET_VOICE_DATA_CB)(IN BYTE_T *data, IN UINT_T len, IN PVOID_T pri_data);

/**
 * \brief callback when download finished
 * \param[in] download_result > 0 :  download succeeded
 *            download_result == 0 : download is stopped by tuya_ipc_voice_download_stop api
 *            dowaload_result < 0 :  download failed
 * \param[in] pri_data is pointer set in tuya_ipc_voice_download_start api
 * \return VOID
 */
typedef VOID (*VOICE_NOTIFY_CB)(IN INT_T download_result, IN PVOID_T pri_data);

API 说明

初始化

/**
 * \fn OPERATE_RET tuya_ipc_voice_init  
 * \brief initialize voice
 * \param[in] code is voice code
 * \param[in] max_voice_num is max voice number in voice list
 * \return OPERATE_RET
 */
OPERATE_RET tuya_ipc_voice_init(IN CHAR_T *code, IN UINT_T max_voice_num);

参数说明

参数 说明
code 下载后的音频文件的前缀命名,可参照云端参数或自定义设置。
max_voice_num 音频文件的最大存储数量,与 VOICE_LIST_S 类型同时使用。

反初始化

/**
 * \fn VOID tuya_ipc_voice_uninit  
 * \brief uninitialize voice
 * \return VOID
 */
VOID tuya_ipc_voice_uninit(VOID);

执行后停止下载任务,退出内部工作的线程。

获取语音文件列表

/**
 * \fn OPERATE_RET tuya_ipc_get_voice_list  
 * \brief get voice list
 * \param[inout] voice_list is the voice list, voice list is array which has max_voice_num elements
 * \param[in] upgrade, update the latest voice list immediately if upgrade is TRUE
 * \return OPERATE_RET
 */
OPERATE_RET tuya_ipc_get_voice_list(INOUT VOICE_LIST_S *voice_list, BOOL_T upgrade);

参数说明

参数 说明
voice_list 传入传出参数,链表中将会填充从云端获取到的文件信息。每个文件对应链表中的每个元素,每个文件都会包含 ID 等信息,可用于下载时的传参。
upgrade 强制从云端更新标记。

语音文件下载

/**
 * \fn OPERATE_RET tuya_ipc_voice_download_start
 * \brief start downloading voice
 * \param[in] code is voice code
 * \param[in] id is voice id for each voice file
 * \param[in] get_voice_cb is voice file downloading callback function
 * \param[in] voice_notify_cb is voice file download finished callback function
 * \param[in] priv_data is pointer passed to get_voice_cb and voice_notify_cb callback function
 * \return OPERATE_RET
 */
OPERATE_RET tuya_ipc_voice_download_start(IN CHAR_T *code, IN INT_T id, IN GET_VOICE_DATA_CB get_voice_cb, IN VOICE_NOTIFY_CB voice_notify_cb, IN PVOID_T pri_data);

参数说明

参数 说明
code 参数和初始化时的 code 一致。
id 参数对应从云端获取的语音文件信息中的 ID,即想要下载的文件 ID。
get_voice_cb 下载回调函数,需要自行实现,回调中可直接对语音数据进行保存操作。
voice_notify_cb 下载结束回调,需要自行实现,下载完成自动进入该回调中。
pri_data 是上述回调中的传参句柄。

终止下载流程

/**
 * \fn VOID tuya_ipc_download_stop  
 * \brief stop downloading voice
 * \return VOID
 */
VOID tuya_ipc_voice_download_stop(VOID);

调用后,将会主动终止正在下载的文件。

功能接入流程

该功能涉及到网络、时间等基础业务。首先需要激活设备并绑定 App,其次需要等待 MQTT 上线以及同步到时间,然后才进行初始化启动。参考下图:

涂鸦 SDK 初始化、启动
等待 MQTT 上线
自定义语音初始化 tuya_ipc_voice_init

语音功能成功初始化后,可根据上层业务需要,执行获取列表和下载任务。

操作流程

  1. App 中录制一段语音。设备端并不会响应,App 录制语音后上传至云端。
  2. App 选中语音。App 下发 DP 传递选中的语音 ID 给设备端,设备端拿到此 ID 后,可调用相关下载 API tuya_ipc_voice_download_start 执行下载任务。对应的 DP 和产品的后台配置相关。

Log 输出

调试阶段,建议 Log 等级放开到 debug 级别 tuya_ipc_set_log_attr(4,NULL)

  • 初始化成功输出

    自定义语音
  • 获取语音文件列表输出

    自定义语音
  • 下载获取文件时输出

    自定义语音

FAQ

初始化失败

检查传参是否异常。

获取文件列表失败或文件列数量太少

  • 检查传参是否有效。
  • 检查 voice_list 大小是否满足要求。

下载语音失败

  • 检查文件 ID 是否有效,确定云端是否存在此文件。
  • API 的 code 参数是否有效。
  • 检查网络状况。
  • 检查 API 中回调。

下载后的语音文件无法播放

  • 检查下载后的语音文件大小是否与获取的文件信息匹配。
  • 云端语音文件格式为 .wav,检查播放器是否能解析。