add: 添加air780epvh的定位演示代码,初始化版本
[LuatOS.git] / demo / tts / main.lua
blob6a8fea15f314a91e94ee65fcc49ba4699ca64f45
2 -- LuaTools需要PROJECT和VERSION这两个信息
3 PROJECT = "testtts"
4 VERSION = "2.0.0"
6 --[[
7 本demo当前仅支持ec618系列和ec718系列
9 ## 提醒:
10 1. 本demo需要2022.12.21及之后的源码所编译的LuatOS固件
11 2. 本demo若使用外置TTS资源的LuatOS固件, 就必须有外挂的SPI Flash, 起码1M字节, 后面有刷写说明
12 3. 下载脚本时, 把txt也加上一起下载
13 4. 本demo需要音频扩展板, 780E只有I2S输出, 需要codec和PA才能驱动喇叭
14 5. 内置TTS资源的LuatOS最低版本是V1104,且去掉了很多库, 尤其是UI方面的库
16 ## 使用本demo前,如果是外置TTS资源的LuatOS固件, 必须先刷tts.binpkg进行SPI Flash的刷写
17 1. 下载链接:
18 618系列:https://gitee.com/openLuat/luatos-soc-2022/attach_files
19 718系列:https://gitee.com/openLuat/luatos-soc-2023/attach_files
20 2. 在LuaTools主界面, 用"下载固件"按钮进行下载.
21 3. 下载前需要接好SPI Flash!!
22 4. 下载前选日志模式 4G USB, luatools版本号2.1.85或以上
24 ## SPI Flash布局, 以1M字节为例,供参考:
26 -----------------------------------
27 64 k 保留空间, 用户自行分配
28 -----------------------------------
29 704k TTS数据
30 -----------------------------------
31 剩余空间, 256k,用户自行分配
32 -----------------------------------
34 ## 基本流程:
35 1. 初始化sfud, 本demo使用SPI0 + GPIO8
36 2. 使用 audio.tts播放文本
37 3. 等待 播放结束事件
38 4. 从第二步重新下一个循环
40 ## 接线说明
42 以780E开发板为例, 需要1.5版本或以上,团购版本均为1.5或以上.
43 1.4版本SPI分布有所不同, 注意区分.
45 https://wiki.luatos.com/chips/air780e/board.html
47 xx脚指开发板pinout图上的顺序编号, 非GPIO编号
49 Flash -- 开发板
50 GND -- 16脚, GND
51 VCC -- 15脚, 3.3V
52 CLK -- 14脚, GPIO11/SPI0_CLK/LCD_CLK, 时钟. 如果是1.4版本的开发板, 接05脚的GPIO11/UART2_TXD
53 MOSI -- 13脚, GPIO09/SPI0_MOSI/LCD_OUT,主控数据输出
54 MISO -- 11脚, GPIO10/SPI0_MISO/LCD_RS,主控数据输入. 如果是1.4版本的开发板, 接06脚的GPIO10/UART2_RXD
55 CS -- 10脚, GPIO08/SPI0_CS/LCD_CS,片选.
57 注意: 12脚是跳过的, 接线完毕后请检查好再通电!!
60 -- sys库是标配
61 _G.sys = require("sys")
62 _G.sysplus = require("sysplus")
65 -- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
66 if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
67 pm.power(pm.PWK_MODE, false)
68 end
70 function audio_setup()
71 local bsp = rtos.bsp()
72 if bsp == "EC618" then
73 --Air780E开发板配套+音频扩展板. ES7149
74 --由于音频扩展板的PA是长供电的,有塔塔声音是正常的,做产品的话有额外的参考设计
75 i2s.setup(0, 0, 0, 0, 0, i2s.MODE_I2S)
77 --如果用TM8211,打开下面的注释
78 -- i2s.setup(0, 0, 0, 0, 0, i2s.MODE_MSB)
80 --如果用软件DAC,打开下面的注释
81 -- if audio.setBus then
82 -- audio.setBus(0, audio.BUS_SOFT_DAC)
83 -- end
84 audio.config(0, 25, 1, 3, 100)
85 elseif bsp == "EC718P" then
86 -- CORE+音频小板是这个配置
87 pm.power(pm.LDO_CTL, false) --开发板上ES8311由LDO_CTL控制上下电
88 sys.wait(100)
89 pm.power(pm.LDO_CTL, true) --开发板上ES8311由LDO_CTL控制上下电
91 local multimedia_id = 0
92 local i2c_id = 0
93 local i2s_id = 0
94 local i2s_mode = 0
95 local i2s_sample_rate = 16000
96 local i2s_bits_per_sample = 16
97 local i2s_channel_format = i2s.MONO_R
98 local i2s_communication_format = i2s.MODE_LSB
99 local i2s_channel_bits = 16
101 local pa_pin = 25
102 local pa_on_level = 1
103 local pa_delay = 100
104 local power_pin = 255
105 local power_on_level = 1
106 local power_delay = 3
107 local power_time_delay = 100
109 local voice_vol = 70
110 local mic_vol = 80
112 i2c.setup(i2c_id,i2c.FAST)
113 i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,i2s_channel_bits)
115 audio.config(multimedia_id, pa_pin, pa_on_level, power_delay, pa_delay, power_pin, power_on_level, power_time_delay)
116 audio.setBus(multimedia_id, audio.BUS_I2S,{chip = "es8311",i2cid = i2c_id , i2sid = i2s_id}) --通道0的硬件输出通道设置为I2S
118 audio.vol(multimedia_id, voice_vol)
119 audio.micVol(multimedia_id, mic_vol)
120 --带TM8211的云喇叭开发板参考下面的配置
121 --[[
122 local multimedia_id = 0
123 local i2s_id = 0
124 local i2s_mode = 0
125 local i2s_sample_rate = 0
126 local i2s_bits_per_sample = 16
127 local i2s_channel_format = i2s.STEREO
128 local i2s_communication_format = i2s.MODE_MSB
129 local i2s_channel_bits = 16
131 local pa_pin = 25
132 local pa_on_level = 1
133 local pa_delay = 100
134 local power_pin = nil
135 local power_on_level = 1
136 local power_delay = 3
137 local power_time_delay = 0
139 -- local voice_vol = 200 --默认就不放大了
140 i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,i2s_channel_bits)
141 audio.config(multimedia_id, pa_pin, pa_on_level, power_delay, pa_delay, power_pin, power_on_level, power_time_delay)
142 audio.setBus(multimedia_id, audio.BUS_I2S,{chip = "tm8211", i2sid = i2s_id}) --通道0的硬件输出通道设置为I2S
143 -- audio.vol(multimedia_id, voice_vol)
145 elseif bsp == "AIR105" then
146 -- Air105开发板支持DAC直接输出
147 audio.config(0, 25, 1, 3, 100)
148 else
149 -- 其他板子未支持
150 while 1 do
151 log.info("audio", "尚未支持的BSP")
152 sys.wait(1000)
155 sys.publish("AUDIO_READY")
158 -- 配置好audio外设
159 sys.taskInit(audio_setup)
161 local taskName = "task_audio"
163 local MSG_MD = "moreData" -- 播放缓存有空余
164 local MSG_PD = "playDone" -- 播放完成所有数据
166 audio.on(0, function(id, event)
167 --使用play来播放文件时只有播放完成回调
168 local succ,stop,file_cnt = audio.getError(0)
169 if not succ then
170 if stop then
171 log.info("用户停止播放")
172 else
173 log.info("第", file_cnt, "个文件解码失败")
176 sysplus.sendMsg(taskName, MSG_PD)
177 end)
180 local function audio_task()
181 local result
182 sys.waitUntil("AUDIO_READY")
183 -- 初始化spi flash, 如果是极限版TTS_ONCHIP,就不需要初始化
184 if sfud then
185 spi_flash = spi.deviceSetup(0,8,0,0,8,25600000,spi.MSB,1,0)
186 local ret = sfud.init(spi_flash)
187 if ret then
188 log.info("sfud.init ok")
189 else
190 log.info("sfud.init error", ret)
191 return
193 else
194 log.info("tts", "TTS_ONCHIP?? skip sfud")
197 -- 本例子是按行播放 "千字文", 文本来源自wiki百科
198 local fd = nil
199 local line = nil
200 while true do
201 log.info("开始播放")
202 line = nil
203 if not fd then
204 fd = io.open("/luadb/qianzw.txt")
206 if fd then
207 line = fd:read("*l")
208 if line == nil then
209 fd:close()
210 fd = nil
213 if line == nil then
214 line = "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十"
216 line = line:trim()
217 log.info("播放内容", line)
218 result = audio.tts(0, line)
219 if result then
220 --等待音频通道的回调消息,或者切换歌曲的消息
221 while true do
222 msg = sysplus.waitMsg(taskName, nil)
223 if type(msg) == 'table' then
224 if msg[1] == MSG_PD then
225 log.info("播放结束")
226 break
228 else
229 log.error(type(msg), msg)
232 else
233 log.debug("解码失败!")
234 sys.wait(1000)
236 if not audio.isEnd(0) then
237 log.info("手动关闭")
238 audio.playStop(0)
240 if audio.pm then
241 audio.pm(0,audio.STANDBY)
243 -- audio.pm(0,audio.SHUTDOWN) --低功耗可以选择SHUTDOWN或者POWEROFF,如果codec无法断电用SHUTDOWN
244 log.info("mem", "sys", rtos.meminfo("sys"))
245 log.info("mem", "lua", rtos.meminfo("lua"))
246 sys.wait(1000)
248 sysplus.taskDel(taskName)
251 sysplus.taskInitEx(audio_task, taskName, task_cb)
253 -- 用户代码已结束---------------------------------------------
254 -- 结尾总是这一句
255 sys.run()
256 -- sys.run()之后后面不要加任何语句!!!!!