main.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "testtts"
  3. VERSION = "1.0.0"
  4. --[[]
  5. 运行环境:Air780EHV核心板+AirAUDIO_1000配件板
  6. 最后修改时间:2025-6-17
  7. 使用了如下IO口:
  8. [5, "spk+", " PIN5脚, 用于喇叭正极"],
  9. [6, "spk-", " PIN6脚, 用于喇叭负极"],
  10. [20, "AudioPA_EN", " PIN20脚, 用于PA使能脚"],
  11. 3.3V
  12. GND
  13. 执行逻辑为:
  14. 设置i2s和音频参数,读取文件qianzw.txt里面的内容,然后播放出来
  15. ]]
  16. -- sysplus库是可选的,可以用sys库代替
  17. -- sys库是标配
  18. _G.sys = require("sys")
  19. _G.sysplus = require("sysplus")
  20. local i2c_id = 0 -- i2c_id 0
  21. local pa_pin = gpio.AUDIOPA_EN -- 喇叭pa功放脚
  22. local power_pin = 20 -- es8311电源脚
  23. local i2s_id = 0 -- i2s_id 0
  24. local i2s_mode = 0 -- i2s模式 0 主机 1 从机
  25. local i2s_sample_rate = 16000 -- 采样率
  26. local i2s_bits_per_sample = 16 -- 数据位数
  27. local i2s_channel_format = i2s.MONO_R -- 声道, 0 左声道, 1 右声道, 2 立体声
  28. local i2s_communication_format = i2s.MODE_LSB -- 格式, 可选MODE_I2S, MODE_LSB, MODE_MSB
  29. local i2s_channel_bits = 16 -- 声道的BCLK数量
  30. local multimedia_id = 0 -- 音频通道 0
  31. local pa_on_level = 1 -- PA打开电平 1 高电平 0 低电平
  32. local power_delay = 3 -- 在DAC启动前插入的冗余时间,单位100ms
  33. local pa_delay = 100 -- 在DAC启动后,延迟多长时间打开PA,单位1ms
  34. local power_on_level = 1 -- 电源控制IO的电平,默认拉高
  35. local power_time_delay = 100 -- 音频播放完毕时,PA与DAC关闭的时间间隔,单位1ms
  36. local voice_vol = 50 -- 喇叭音量
  37. local mic_vol = 80 -- 麦克风音量
  38. gpio.setup(power_pin, 1, gpio.PULLUP) -- 设置ES83111电源脚
  39. gpio.setup(pa_pin, 1, gpio.PULLUP) -- 设置功放PA脚
  40. function audio_setup()
  41. log.info("audio_setup")
  42. sys.wait(200)
  43. i2c.setup(i2c_id, i2c.FAST)
  44. i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,
  45. i2s_channel_bits)
  46. audio.config(multimedia_id, pa_pin, pa_on_level, power_delay, pa_delay, power_pin, power_on_level, power_time_delay)
  47. audio.setBus(multimedia_id, audio.BUS_I2S, {
  48. chip = "es8311",
  49. i2cid = i2c_id,
  50. i2sid = i2s_id
  51. }) -- 通道0的硬件输出通道设置为I2S
  52. audio.vol(multimedia_id, voice_vol)
  53. audio.micVol(multimedia_id, mic_vol)
  54. sys.publish("AUDIO_READY")
  55. end
  56. -- 配置好audio外设
  57. sys.taskInit(audio_setup)
  58. local taskName = "task_audio"
  59. local MSG_MD = "moreData" -- 播放缓存有空余
  60. local MSG_PD = "playDone" -- 播放完成所有数据
  61. audio.on(0, function(id, event)
  62. -- 使用play来播放文件时只有播放完成回调
  63. local succ, stop, file_cnt = audio.getError(0)
  64. if not succ then
  65. if stop then
  66. log.info("用户停止播放")
  67. else
  68. log.info("第", file_cnt, "个文件解码失败")
  69. end
  70. end
  71. sysplus.sendMsg(taskName, MSG_PD)
  72. end)
  73. local function audio_task()
  74. local result
  75. sys.waitUntil("AUDIO_READY")
  76. -- 本例子是按行播放 "千字文", 文本来源自wiki百科
  77. local fd = nil
  78. local line = nil
  79. while true do
  80. log.info("开始播放")
  81. line = nil
  82. if not fd then
  83. fd = io.open("/luadb/qianzw.txt")
  84. end
  85. if fd then
  86. line = fd:read("*l")
  87. if line == nil then
  88. fd:close()
  89. fd = nil
  90. end
  91. end
  92. if line == nil then --如果没有找到千字文,播放以下文本
  93. line =
  94. "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十"
  95. end
  96. line = line:trim()
  97. log.info("播放内容", line)
  98. result = audio.tts(0, line)
  99. if result then
  100. -- 等待音频通道的回调消息,或者切换歌曲的消息
  101. while true do
  102. msg = sysplus.waitMsg(taskName, nil)
  103. if type(msg) == 'table' then
  104. if msg[1] == MSG_PD then
  105. log.info("播放结束")
  106. break
  107. end
  108. else
  109. log.error(type(msg), msg)
  110. end
  111. end
  112. else
  113. log.debug("解码失败!")
  114. sys.wait(1000)
  115. end
  116. if not audio.isEnd(0) then
  117. log.info("手动关闭")
  118. audio.playStop(0)
  119. end
  120. if audio.pm then
  121. audio.pm(0, audio.STANDBY)
  122. end
  123. -- audio.pm(0,audio.SHUTDOWN) --低功耗可以选择SHUTDOWN或者POWEROFF,如果codec无法断电用SHUTDOWN
  124. log.info("mem", "sys", rtos.meminfo("sys"))
  125. log.info("mem", "lua", rtos.meminfo("lua"))
  126. sys.wait(1000)
  127. end
  128. sysplus.taskDel(taskName)
  129. end
  130. sysplus.taskInitEx(audio_task, taskName)
  131. -- 用户代码已结束---------------------------------------------
  132. -- 结尾总是这一句
  133. sys.run()
  134. -- sys.run()之后后面不要加任何语句!!!!!