发帖
3 0 0

安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】自定义音频播放控制

WangChong
论坛元老

83

主题

864

回帖

1万

积分

论坛元老

积分
11851
VC系列 53 3 8 小时前
简介



在本篇文章中我将介绍如何使用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


  1. #ifndef USER_INC_USER_PLAYER_H_
  2. #define USER_INC_USER_PLAYER_H_

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6. #include "unione.h"
  7. #include "user_event.h"

  8. /** @addtogroup uni_player_inf
  9. @{*/

  10. /**
  11. *@brief 播放文件
  12. *@param type 播放类型
  13. *@param file 播放文件名
  14. *@retval 0  操作成功
  15. *@retval -1 操作失败
  16. */
  17. int user_player_play(AUDIO_PLAY_TYPE type, const char *file);

  18. /**
  19. *@brief 播放列表序号音频
  20. *@param file_list 文件列表 [1, 2, 3]
  21. *@param num 列表序号
  22. *@retval 0  操作成功
  23. *@retval -1 操作失败
  24. */
  25. int user_player_reply_list_num(const char *file_list, int num);

  26. /**
  27. *@brief 随机播放列表音频
  28. *@param file_list 文件列表 [1, 2, 3]
  29. *@retval 0  操作成功
  30. *@retval -1 操作失败
  31. */
  32. int user_player_reply_list_random(const char *file_list);

  33. /**
  34. *@brief 顺序播放列表中所有音频
  35. *@param file_list 文件列表 [1, 2, 3]
  36. *@retval 0  操作成功
  37. *@retval -1 操作失败
  38. */
  39. int user_player_reply_list_in_order(const char *file_list);

  40. /**
  41. *@brief 停止播放
  42. *@param type 播放类型
  43. *@retval 0  操作成功
  44. *@retval -1 操作失败
  45. */
  46. int user_player_stop(AUDIO_PLAY_TYPE type);

  47. /**
  48. *@brief 设置最小音量
  49. */
  50. int user_player_set_volume_min(void);

  51. /**
  52. *@brief 设置最大音量
  53. */
  54. int user_player_set_volume_max(void);

  55. /**
  56. *@brief 设置中等音量
  57. */
  58. int user_player_set_volume_mid(void);

  59. /**
  60. *@brief 增加音量
  61. */
  62. int user_player_set_volume_up(void);

  63. /**
  64. *@brief 减小音量
  65. */
  66. int user_player_set_volume_down(void);

  67. /**
  68. *@brief 设置喇叭静音
  69. */
  70. int user_player_speaker_mute(void);

  71. /**
  72. *@brief 取消设置喇叭静音
  73. */
  74. int user_player_speaker_unmute(void);

  75. /**
  76. *@brief 系统进入无回复播报模式
  77. */
  78. int user_player_shutup_mode(void);

  79. /**
  80. *@brief 系统退出无回复播报模式
  81. */
  82. int user_player_shutup_exit(void);

  83. /** @}*/

  84. #ifdef __cplusplus
  85. }
  86. #endif
  87. #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
360截图20250523064959.png

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

360截图20250523065105.png

可以从上述user_main 的入口宏判断得知, USER_DEMO_I2C_TIMEUSER_DEMO_SPI_LCD 是不被支持的. 而hb_player则没问题。

4- 使用TTS maker生成一段音频数据。并且命名为109放到tones目录下

360截图20250523065316.png

5- 修改原本代码中播放的 9.MP3 成我们自己拷贝到tones目录下的109

  1. #include "user_player.h"

  2. #define TAG "player_demo"

  3. static void _player_test_process(void *args) {
  4.   while (1) {
  5.     uni_sleep(10);

  6.     user_player_set_volume_min();
  7.     LOGT(TAG, "set min vol");
  8.     /*播放9.mp3文件*/
  9.     user_player_play(AUDIO_PLAY_REPLY, "109"); //9.mp3
  10.     uni_sleep(10);

  11.     user_player_set_volume_mid();
  12.     LOGT(TAG, "set mid vol");
  13.     /*播放列表中的101.MP3文件*/
  14.     user_player_reply_list_num("[9,101,102]", 1);
  15.     uni_sleep(10);

  16.     user_player_set_volume_max();
  17.     LOGT(TAG, "set max vol");
  18.     /*随机播放列表中的某个文件*/
  19.     user_player_reply_list_random("[9,101,102]");
  20.     uni_sleep(10);

  21.     /*顺序播放列表中的所有文件*/
  22.     user_player_reply_list_in_order("[9,101,102]");
  23.     uni_sleep(10);
  24.   }
  25. }

  26. static Result _create_player_test_thread(void) {
  27.   thread_param param;
  28.   uni_pthread_t pid;
  29.   uni_memset(&param, 0, sizeof(param));
  30.   param.stack_size = STACK_SMALL_SIZE;
  31.   param.priority = OS_PRIORITY_LOW;
  32.   uni_strncpy(param.task_name, "player_test", sizeof(param.task_name) - 1);
  33.   if (0 != uni_pthread_create(&pid, &param,
  34.                               _player_test_process, NULL)) {
  35.     LOGE(TAG, "create thread failed");
  36.     return E_FAILED;
  37.   }
  38.   uni_pthread_detach(pid);
  39.   return E_OK;
  40. }

  41. int hb_player(void) {
  42.   _create_player_test_thread();
  43.   return 0;
  44. }
复制代码
这段代码创建了一个独立线程,在线程中循环执行音频播放测试。它先依次设置播放器的音量为最小、中等和最大,然后分别调用接口播放单个指定文件、播放列表中的特定文件、随机播放播放列表中的文件,以及顺序播放整个播放列表。每次操作后线程都会短暂休眠,保证播放流程有序进行。该代码用于验证播放器在不同音量和播放模式下的功能是否正常。


6- 烧录和测试


360截图20250523065754.png


实验现象

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

360截图20250523070104.png

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

360截图20250523070158.png

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

360截图20250523070346.png

如上图所示为我们自己创建的音频文件的采样率为24000, 所以下载到VC02中, 音频播放的时候会很奇怪(属于正常现象。)


附件
上传的附件: uni_app_release_update.zip (893.74 KB, 下载次数: 0)


──── 0人觉得很赞 ────

使用道具 举报

学习了
王哥,通宵了么这是😂,年轻就是好。
3 小时前
WT_0213 发表于 2025-5-23 08:53
王哥,通宵了么这是😂,年轻就是好。

哎, 说是给园长出的,前几天耽误了
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28796 个
  • 话题数: 41118 篇