【离线语音】安信可VC-01/02二次开发篇:自定义音频播放控制

描述


安信可离线语音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_TIMEUSER_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

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分