play_tts.lua 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. --[[
  2. @module play_tts
  3. @summary 文字转语音
  4. @version 1.0
  5. @date 2025.09.08
  6. @author 梁健
  7. @usage
  8. 本文件为流式播放应用功能模块,核心业务逻辑为:
  9. 1、播放一个TTS
  10. 2、点powerkey 按键进行tts 的音色切换
  11. 3、点击boot 按键停止音频播放
  12. 本文件没有对外接口,直接在main.lua中require "play_tts"就可以加载运行;
  13. ]]
  14. exaudio = require("exaudio")
  15. local taskName = "task_audio"
  16. -- 音频初始化设置参数,exaudio.setup 传入参数
  17. local audio_setup_param ={
  18. model= "es8311", -- 音频编解码类型,可填入"es8311","es8211"
  19. i2c_id = 0, -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
  20. pa_ctrl = gpio.AUDIOPA_EN, -- 音频放大器电源控制管脚
  21. dac_ctrl = 20, -- 音频编解码芯片电源控制管脚,780ehv 默认使用20
  22. }}
  23. local function play_end(event)
  24. if event == exaudio.PLAY_DONE then
  25. log.info("播放完成",exaudio.is_end())
  26. exaudio.play_stop()
  27. end
  28. end
  29. local audio_play_param ={
  30. type= 1, -- 播放类型,有0,播放文件,1.播放tts 2. 流式播放
  31. -- 如果是播放文件,支持mp3,amr,wav格式
  32. -- 如果是tts,内容格式见:https://docs.openluat.com/air780epm/common/tts/
  33. -- 流式播放,仅支持PCM 格式音频,如果是流式播放,则sampling_rate, sampling_depth,signed_or_unsigned 必填写
  34. content = "支付宝到账,1千万元", -- 如果播放类型为0时,则填入string 是播放单个音频文件,如果是表则是播放多段音频文件。
  35. cbfnc = play_end, -- 播放完毕回调函数
  36. }
  37. ---------------------------------
  38. ---通过BOOT 按键进行播放停止操作---
  39. ---------------------------------
  40. local function stop_audio()
  41. log.info("停止播放")
  42. sys.sendMsg(taskName, MSG_KEY_PRESS, "STOP_AUDIO")
  43. end
  44. --按下boot 停止播放
  45. gpio.setup(0, stop_audio, gpio.PULLDOWN, gpio.RISING)
  46. gpio.debounce(0, 200, 1)
  47. ---------------------------------
  48. ---通过POWERKEY按键进行音频切换---
  49. ---------------------------------
  50. local function next_audio()
  51. log.info("切换播放")
  52. sys.sendMsg(taskName, MSG_KEY_PRESS, "NEXT_AUDIO")
  53. end
  54. --按下powerkey 打断播放,播放优先级更高的音频
  55. gpio.setup(gpio.PWR_KEY, next_audio, gpio.PULLUP, gpio.FALLING)
  56. gpio.debounce(gpio.PWR_KEY, 200, 1) -- 防抖,防止频繁触发
  57. ---------------------------------------------------------------------------------------------------
  58. ---------------主task------------------------------------------------------------------------------
  59. --- 关于TTS 音色设置请见: https://docs.openluat.com/air780epm/common/tts/
  60. ---------------------------------------------------------------------------------------------------
  61. local index_number = 1
  62. local audio_path = nil
  63. local function audio_task()
  64. log.info("开始播放TTS")
  65. if exaudio.setup(audio_setup_param) then
  66. exaudio.play_start(audio_play_param) -- 仅仅支持task 中运行
  67. while true do
  68. local msg = sys.waitMsg(taskName, MSG_KEY_PRESS) -- 等待按键触发
  69. if msg[2] == "NEXT_AUDIO" then
  70. if index_number %5 == 0 then -- 切换播报音色
  71. audio_path = "[m51]支付宝到账,1千万元" -- 许久
  72. elseif index_number %5 == 1 then
  73. audio_path = "[m52]支付宝到账,1千万元" -- 许多
  74. elseif index_number %5 == 2 then
  75. audio_path = "[m53]支付宝到账,1千万元" -- 晓萍
  76. elseif index_number %5 == 3 then
  77. audio_path = "[m54]支付宝到账,1千万元" -- 唐老鸭
  78. elseif index_number %5 == 4 then
  79. audio_path = "[m55]支付宝到账,1千万元" -- 许宝宝
  80. end
  81. exaudio.play_start({type= 1, content = audio_path,cbfnc = play_end,priority = index_number})
  82. index_number= index_number +1
  83. elseif msg[2] == "STOP_AUDIO" then
  84. exaudio.play_stop()
  85. end
  86. end
  87. end
  88. end
  89. sys.taskInitEx(audio_task, taskName)