安信可离线语音VC-01/02:硬件规格书、开发资料、烧录工具、应用开发
安信可离线语音模组 VC-01、VC-02 系列教程 【基础认知篇】
安信可离线语音模组 VC-01、VC-02 系列教程 【快速上手篇】
安信可离线语音模组 VC-01、VC-02 系列教程 【中级入门篇】
安信可离线语音模组 VC-01、VC-02 系列教程 【高级进阶篇】
安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】虚拟开发环境搭建和分享
安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】事件和GPIO控制
安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】PWM输出
安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】串口输出
安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】SDK音频替换失败记录过程
安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】自定义音频播放控制
安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】自定义音频播放控制
简介
在本篇文章中将介绍如何使用SDK来进行自定义音频播放的功能。
在上一篇文章安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】自定义音频替换失败过程中,简要概述了res_build_tool.py 文件, 其主要的作用就是将音频文件进行转换,从而使编译固件的时候能够将音频文件编译到BIN中,然后在各项事件触发的时候实现播放。
虽然在上一篇文章中我们失败的尝试了替换对应的语音文件,但是还有另一种方法来实现音频数据的播放。 即使用user_player.h进行控制。
自定义音频播放
1、根据蜂鸟M的离线开发指导手册得知,其user_player.h文件可以被用户使用并且控制音频的播放。
其文件位于/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/inc/user_player.h
#ifndef USER_INC_USER_PLAYER_H_
#define USER_INC_USER_PLAYER_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "unione.h"
#include "user_event.h"
/** @addtogroup uni_player_inf
@{*/
/**
*@brief 播放文件
*@param type 播放类型
*@param file 播放文件名
*@retval 0 操作成功
*@retval -1 操作失败
*/
int user_player_play(AUDIO_PLAY_TYPE type, const char *file);
/**
*@brief 播放列表序号音频
*@param file_list 文件列表 [1, 2, 3]
*@param num 列表序号
*@retval 0 操作成功
*@retval -1 操作失败
*/
int user_player_reply_list_num(const char *file_list, int num);
/**
*@brief 随机播放列表音频
*@param file_list 文件列表 [1, 2, 3]
*@retval 0 操作成功
*@retval -1 操作失败
*/
int user_player_reply_list_random(const char *file_list);
/**
*@brief 顺序播放列表中所有音频
*@param file_list 文件列表 [1, 2, 3]
*@retval 0 操作成功
*@retval -1 操作失败
*/
int user_player_reply_list_in_order(const char *file_list);
/**
*@brief 停止播放
*@param type 播放类型
*@retval 0 操作成功
*@retval -1 操作失败
*/
int user_player_stop(AUDIO_PLAY_TYPE type);
/**
*@brief 设置最小音量
*/
int user_player_set_volume_min(void);
/**
*@brief 设置最大音量
*/
int user_player_set_volume_max(void);
/**
*@brief 设置中等音量
*/
int user_player_set_volume_mid(void);
/**
*@brief 增加音量
*/
int user_player_set_volume_up(void);
/**
*@brief 减小音量
*/
int user_player_set_volume_down(void);
/**
*@brief 设置喇叭静音
*/
int user_player_speaker_mute(void);
/**
*@brief 取消设置喇叭静音
*/
int user_player_speaker_unmute(void);
/**
*@brief 系统进入无回复播报模式
*/
int user_player_shutup_mode(void);
/**
*@brief 系统退出无回复播报模式
*/
int user_player_shutup_exit(void);
/** @}*/
#ifdef __cplusplus
}
#endif
#endif
上述为所有用户音频播放函数定义。功能相当丰富,包括了音频的播放和音量的调节,而正好对应的example中也有音频播放的示例。
2、修改
/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/inc/user_config.h 中对USER_RUN_DEMO_SELECT 的宏, 指向USER_DEMO_PLAYER

3、查找这个宏,检查SDK是否支持。

可以从上述user_main 的入口宏判断得知, USER_DEMO_I2C_TIME和USER_DEMO_SPI_LCD 是不被支持的,而hb_player则没问题。
4、使用TTS maker生成一段音频数据。并且命名为109放到tones目录下。

5、修改原本代码中播放的 9.MP3 ,拷贝到tones目录下的109。
#include "user_player.h"
#define TAG "player_demo"
static void _player_test_process(void *args) {
while (1) {
uni_sleep(10);
user_player_set_volume_min();
LOGT(TAG, "set min vol");
/*播放9.mp3文件*/
user_player_play(AUDIO_PLAY_REPLY, "109"); //9.mp3
uni_sleep(10);
user_player_set_volume_mid();
LOGT(TAG, "set mid vol");
/*播放列表中的101.MP3文件*/
user_player_reply_list_num("[9,101,102]", 1);
uni_sleep(10);
user_player_set_volume_max();
LOGT(TAG, "set max vol");
/*随机播放列表中的某个文件*/
user_player_reply_list_random("[9,101,102]");
uni_sleep(10);
/*顺序播放列表中的所有文件*/
user_player_reply_list_in_order("[9,101,102]");
uni_sleep(10);
}
}
static Result _create_player_test_thread(void) {
thread_param param;
uni_pthread_t pid;
uni_memset(¶m, 0, sizeof(param));
param.stack_size = STACK_SMALL_SIZE;
param.priority = OS_PRIORITY_LOW;
uni_strncpy(param.task_name, "player_test", sizeof(param.task_name) - 1);
if (0 != uni_pthread_create(&pid, ¶m,
_player_test_process, NULL)) {
LOGE(TAG, "create thread failed");
return E_FAILED;
}
uni_pthread_detach(pid);
return E_OK;
}
int hb_player(void) {
_create_player_test_thread();
return 0;
}
这段代码创建了一个独立线程,在线程中循环执行音频播放测试。它先依次设置播放器的音量为最小、中等和最大,然后分别调用接口播放单个指定文件、播放列表中的特定文件、随机播放播放列表中的文件,以及顺序播放整个播放列表。
每次操作后线程都会短暂休眠,保证播放流程有序进行。该代码用于验证播放器在不同音量和播放模式下的功能是否正常。
6、烧录和测试

实验现象
系统上电后等待初始化后 “你好我是小美”将优先被播放, 之后进行音量调整并且循环往复。 这里会存在一个问题即,SDK中所有的音频的采样率都是16000Hz。
这个采样率已经在
/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/src/sdk/player/src/uni_media_player.c中进行了定义。

和/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/src/sdk/audio/audio_player/src/uni_audio_player.c 中被定义。

所以自定义的音频文件最好和这个定义的采样率保持一致,否则会出现采样率不匹配出现奇怪的声音。

如上图所示,创建的音频文件的采样率为24000, 所以下载到VC-02中, 音频播放的时候会很奇怪(属于正常现象)。
附件
uni_app_release_update.zip
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !