소스 검색

add: 添加ec618下的tts播放示例

Wendal Chen 3 년 전
부모
커밋
9ef719016d
2개의 변경된 파일208개의 추가작업 그리고 0개의 파일을 삭제
  1. 145 0
      demo/tts/main.lua
  2. 63 0
      demo/tts/qianzw.txt

+ 145 - 0
demo/tts/main.lua

@@ -0,0 +1,145 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "testtts"
+VERSION = "2.0.0"
+
+--[[
+本demo当前仅支持Ar780E和Air600E
+
+提醒:
+1. 本demo需要2022.12.21及之后的源码所编译的LuatOS固件
+2. 本demo必须有外挂的SPI Flash, 起码1M字节
+3. 使用本demo前,必须先刷tts.binpkg进行SPI Flash的刷写,下载链接 TODO
+4. 本demo需要音频扩展板, 780E只有I2S输出, 需要codec和PA才能驱动喇叭
+
+SPI Flash布局, 以1M字节为例,供参考:
+-----------------------------------
+64 k 保留空间, 用户自行分配
+-----------------------------------
+704k TTS数据
+-----------------------------------
+剩余空间, 256k,用户自行分配
+-----------------------------------
+
+基本流程:
+1. 初始化sfud, 本demo使用SPI0 + GPIO8
+2. 使用 audio.tts播放文本
+3. 等待 播放结束事件
+4. 继续下一个循环
+
+接线说明, 以780E开发板为例, 需要1.5版本或以上. 1.4版本SPI分布有所不同
+
+https://wiki.luatos.com/chips/air780e/board.html
+
+ xx脚指开发板pinout图上的顺序编号, 非GPIO编号
+
+Flash -- 开发板
+GND   -- 16脚, GND
+VCC   -- 15脚, 3.3V
+CLK   -- 14脚, GPIO11/SPI0_CLK, 时钟. 如果是1.4版本的开发板, 接05脚的GPIO11/UART2_TXD
+MOSI  -- 13脚, GPIO09/SPI0_MOSI,主控数据输出
+MISO  -- 11脚, GPIO10/SPI0_MISO,主控数据输入. 如果是1.4版本的开发板, 接05脚的GPIO10/UART2_RXD
+CS    -- 10脚, GPIO08/SPI0_CS,片选.
+
+注意: 12脚是跳过的, 接线完毕后请检查好再通电!!
+]]
+
+-- sys库是标配
+_G.sys = require("sys")
+_G.sysplus = require("sysplus")
+
+local taskName = "task_audio"
+
+local MSG_MD = "moreData"   -- 播放缓存有空余
+local MSG_PD = "playDone"   -- 播放完成所有数据
+
+audio.on(0, function(id, event)
+    --使用play来播放文件时只有播放完成回调
+    local succ,stop,file_cnt = audio.getError(0)
+    if not succ then
+        if stop then
+            log.info("用户停止播放")
+        else
+            log.info("第", file_cnt, "个文件解码失败")
+        end
+    end
+    sysplus.sendMsg(taskName, MSG_PD)
+end)
+
+
+local function audio_task()
+    local result
+    --Air780E开发板配套
+    i2s.setup(0, 0, 0, 0, 0, i2s.MODE_MSB)
+    audio.config(0, 25, 1, 6, 200)
+    gpio.setup(24, 0)
+    gpio.setup(23, 0)
+    gpio.setup(27, 0)
+    gpio.setup(2, 0)
+
+    -- 初始化spi flash
+    spi_flash = spi.deviceSetup(0,8,0,0,8,25600000,spi.MSB,1,0)
+    local ret = sfud.init(spi_flash)
+    if ret then
+        log.info("sfud.init ok")
+    else
+        log.info("sfud.init error", ret)
+        return
+    end
+
+    -- 本例子是按行播放 "千字文", 文本来源自wiki百科
+    local fd = nil
+    local line = nil
+    while true do
+        log.info("开始播放")
+        line = nil
+        if not fd then
+            fd = io.open("/luadb/qianzw.txt")
+        end
+        if fd then
+            line = fd:read("*l")
+            if line == nil then
+                fd:close()
+                fd = nil
+            end
+        end
+        if line == nil then
+            line = "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十"
+        end
+        line = line:trim()
+        log.info("播放内容", line)
+        result = audio.tts(0, line)
+        if result then
+        --等待音频通道的回调消息,或者切换歌曲的消息
+            while true do
+                msg = sysplus.waitMsg(taskName, nil)
+                if type(msg) == 'table' then
+                    if msg[1] == MSG_PD then
+                        log.info("播放结束")
+                        break
+                    end
+                else
+                    log.error(type(msg), msg)
+                end
+            end
+        else
+            log.debug("解码失败!")
+            sys.wait(1000)
+        end
+        if not audio.isEnd(0) then
+            log.info("手动关闭")
+            audio.playStop(0)
+        end
+        log.info(rtos.meminfo("sys"))
+        log.info(rtos.meminfo("lua"))
+        sys.wait(1000)
+    end
+    sysplus.taskDel(taskName)
+end
+
+sysplus.taskInitEx(audio_task, taskName, task_cb)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 63 - 0
demo/tts/qianzw.txt

@@ -0,0 +1,63 @@
+天地玄黄,宇宙洪荒.日月盈昃,辰宿列张.
+寒来暑往,秋收冬藏.闰余成岁,律吕调阳.
+云腾致雨,露结为霜.金生丽水,玉出昆冈.
+剑号巨阙,珠称夜光.果珍李柰,菜重芥姜.
+海咸河淡,鳞潜羽翔.龙师火帝,鸟官人皇.
+始制文字,乃服衣裳.推位让国,有虞陶唐.
+吊民伐罪,周发殷汤.坐朝问道,垂拱平章.
+爱育黎首,臣伏戎羌.遐迩一体,率宾归王.
+鸣凤在竹,白驹食场.化被草木,赖及万方.
+盖此身发,四大五常.恭惟鞠养,岂敢毁伤.
+女慕贞洁,男效才良.知过必改,得能莫忘.
+罔谈彼短,靡恃己长.信使可覆,器欲难量.
+墨悲丝染,诗赞羔羊.景行维贤,克念作圣.
+德建名立,形端表正.空谷传声,虚堂习听.
+祸因恶积,福缘善庆.尺璧非宝,寸阴是竞.
+资父事君,曰严与敬.孝当竭力,忠则尽命.
+临深履薄,夙兴温凊.似兰斯馨,如松之盛.
+川流不息,渊澄取映.容止若思,言辞安定.
+笃初诚美,慎终宜令.荣业所基,籍甚无竟.
+学优登仕,摄职从政.存以甘棠,去而益咏.
+乐殊贵贱,礼别尊卑.上和下睦,夫唱妇随.
+外受傅训,入奉母仪.诸姑伯叔,犹子比儿.
+孔怀兄弟,同气连枝.交友投分,切磨箴规.
+仁慈隐恻,造次弗离.节义廉退,颠沛匪亏.
+性静情逸,心动神疲.守真志满,逐物意移.
+坚持雅操,好爵自縻.都邑华夏,东西二京.
+背邙面洛,浮渭据泾.宫殿盘郁,楼观飞惊.
+图写禽兽,画彩仙灵.丙舍旁启,甲帐对楹.
+肆筵设席,鼓瑟吹笙.升阶纳陛,弁转疑星.
+右通广内,左达承明.既集坟典,亦聚群英.
+杜稿钟隶,漆书壁经.府罗将相,路侠槐卿.
+户封八县,家给千兵.高冠陪辇,驱毂振缨.
+世禄侈富,车驾肥轻.策功茂实,勒碑刻铭.
+磻溪伊尹,佐时阿衡.奄宅曲阜,微旦孰营.
+桓公匡合,济弱扶倾.绮回汉惠,说感武丁.
+俊乂密勿,多士实宁.晋楚更霸,赵魏困横.
+假途灭虢,践土会盟.何遵约法,韩弊烦刑.
+起翦颇牧,用军最精.宣威沙漠,驰誉丹青.
+九州禹迹,百郡秦并.岳宗泰岱,禅主云亭.
+雁门紫塞,鸡田赤城.昆池碣石,钜野洞庭.
+旷远绵邈,岩岫杳冥.治本于农,务兹稼穑.
+俶载南亩,我艺黍稷.税熟贡新,劝赏黜陟.
+孟轲敦素,史鱼秉直.庶几中庸,劳谦谨敕.
+聆音察理,鉴貌辨色.贻厥嘉猷,勉其祗植.
+省躬讥诫,宠增抗极.殆辱近耻,林皋幸即.
+两疏见机,解组谁逼.索居闲处,沉默寂寥.
+求古寻论,散虑逍遥.欣奏累遣,戚谢欢招.
+渠荷的历,园莽抽条.枇杷晚翠,梧桐蚤凋.
+陈根委翳,落叶飘摇.游鹍独运,凌摩绛霄.
+耽读玩市,寓目囊箱.易輶攸畏,属耳垣墙.
+具膳餐饭,适口充肠.饱饫烹宰,饥厌糟糠.
+亲戚故旧,老少异粮.妾御绩纺,侍巾帷房.
+纨扇圆絜,银烛炜煌.昼眠夕寐,蓝笋象床.
+弦歌酒宴,接杯举觞.矫手顿足,悦豫且康.
+嫡后嗣续,祭祀烝尝.稽颡再拜,悚惧恐惶.
+笺牒简要,顾答审详.骸垢想浴,执热愿凉.
+驴骡犊特,骇跃超骧.诛斩贼盗,捕获叛亡.
+布射僚丸,嵇琴阮啸.恬笔伦纸,钧巧任钓.
+释纷利俗,并皆佳妙.毛施淑姿,工颦妍笑.
+年矢每催,曦晖朗曜.璇玑悬斡,晦魄环照.
+指薪修祜,永绥吉劭.矩步引领,俯仰廊庙.
+束带矜庄,徘徊瞻眺.孤陋寡闻,愚蒙等诮.
+谓语助者,焉哉乎也.