播放TTS/播放文件/录音

一、概述

本文档详细介绍了基于 Air8000 开发板或者 Air8000 核心板的音频功能开发,涵盖音频播放、文字转语音、流式音频处理和录音等核心功能。通过本指南,开发者可以快速掌握 Air8000 的音频处理能力,并实现各种音频应用场景。

录音功能将麦克风采集的模拟声音信号转换为数字音频文件,支持 AMR 和 PCM 格式,可设置采样率、时长和存储路径,适用于语音记录、语音识别等场景。

TTS(文字转语音) 将文本内容实时转换为语音播放,支持中文普通话和多种发音风格调节,可通过特殊标记控制语速、语调、音量等参数,适用于语音提示、内容播报等应用。

播放音频文件功能用于播放设备中的音频文件,支持 MP3、WAV、AMR 等多种格式,可进行单文件或多文件连续播放,适用于音乐、语音提示等场景。其中流式播放仅支持 PCM 格式。适用于音乐播放、语音提示、告警音效等各种音频应用场景。

二、演示功能概述

1、main.lua:主程序入口文件,加载以下 2-6 文件运行。

2、play_file.lua: 播放音频文件,可支持 wav,amr,mp3 格式音频:

  • 自动播放一个 sample-6s.mp3 音乐
  • 点 powerkey 按键进行音频切换
  • 点击 boot 按键停止音频播放

3、play_stream: 流式播放音频,仅支持 PCM 格式:

  • 创建一个播放流式音频 task(task_audio)
  • 创建一个模拟获取流式音频的 task(audio_get_data)
  • 此 task 通过流式传输不断向 exaudio.play_stream_write 填入播放的音频
  • 播放 task 不断播放传入流式音频
  • 使用 powerkey 按键进行音量减小,点击 boot 按键进行音量增加

4、play_tts: 支持文字转普通话输出,需要固件支持:

  • 播放一个 TTS
  • 点 powerkey 按键进行 tts 的音色切换

支持五种音色:51 – 许久、52 – 许多、53 – 晓萍、54 – 唐老鸭、55 – 许宝宝 - 点击 boot 按键停止音频播放

5、record_file: 录音到文件,仅支持 PCM 格式

  • 主程序录音到/record.amr 文件
  • 使用 powerkey 按键进行录音音量减小
  • 点击 boot 按键进行录音音量增加

6、record_stream: 流式录音,仅支持 PCM。

  • 主程序录音进行流式录音
  • 录音过程中不断的进行 recode_data_callback 回调,回调内容为音频流的地址和长度

7、sample-6s.mp3/10.amr: 用于测试本地 mp3 和 amr 文件播放

8、test.pcm: 用于测试 pcm 流式播放(实际可以云端下载)

三、准备硬件环境

1、Air8000 开发板 + 喇叭或者 Air8000 核心板 +AirAudio_1010 音频配件板 + 喇叭

Air8000 核心板和 AirAudio_1010 配件板的硬件接线方式为:

2、TYPE-C USB 数据线一根

  • Air8000 开发板/核心板通过 TYPE-C USB 口供电;
  • TYPE-C USB 数据线直接插到核心板的 TYPE-C USB 座子,另外一端连接电脑 USB 口;

四、准备软件环境

1、Luatools 下载调试工具

2、Air8000 V2016 版本固件,选择支持 TTS 功能的 1、3、5、7、13 或 101、103、105、107、113 号固件。不同版本区别参考 Air8000 LuatOS 固件版本

3、 luatos 需要的脚本和资源文件

4、合宙 LuatIO 工具(GPIO 复用初始化配置)使用说明

5、 lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

五、API 接口

exaudio 扩展库

exaudio 扩展库是 audio 核心库的扩展库,通过简化配置参数和统一接口设计,让音频开发更简单易用。它完整支持录音、播放音频,播放 TTS(文字转语音)功能,并内置了流式处理、电源管理等高级特性,建议新项目直接使用 exaudio 替代 audio 核心库。

六、代码解析

1、main.lua:主程序入口;

--[[
@module  main
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
@version 1.0
@date    2025.09.08
@author  梁健
@usage
本demo演示的核心功能为:
1、play_file.lua: 播放音频文件,可支持wav,amr,mp3 格式音频

2、play_tts: 支持文字转普通话输出需要固件支持

3、play_stream: 流式播放音频,仅支持PCM 格式,可以将音频推流到云端,用来对接大模型或者流式录音的应用。

4、record_file: 录音到文件,仅支持PCM 格式

5、record_stream:  流式录音,仅支持PCM,可以将音频流不断的拉取,可用来对接大模型

6、sample-6s、10.amr: 用于测试本地mp3文件播放

7、test.pcm: 用于测试pcm 流式播放(实际可以云端下载)


更多说明参考本目录下的readme.md文件
]]

--[[
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
PROJECT:项目名,ascii string类型
        可以随便定义,只要不使用,就行
VERSION:项目版本号,ascii string类型
        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
]]

--[[
本demo可直接在Air8000整机开发板上运行
]]

PROJECT = "audio"
VERSION = "1.0.0"
-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)


-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
if wdt then
    --配置喂狗超时时间为9秒钟
    wdt.init(9000)
    --启动一个循环定时器,每隔3秒钟喂一次狗
    sys.timerLoopStart(wdt.feed, 3000)
end

-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
-- 启动errDump日志存储并且上传功能,600秒上传一次
-- if errDump then
--     errDump.config(true, 600)
-- end

-- 启动一个循环定时器
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
-- 方便分析内存使用是否有异常
-- sys.timerLoopStart(function()
--     log.info("mem.lua", rtos.meminfo())
--     log.info("mem.sys", rtos.meminfo("sys"))
-- end, 3000)



-- require "play_file"     --   播放音频文件,可支持wav,amr,mp3 格式音频
-- require "play_tts"      -- 支持文字转普通话输出需要固件支持
-- require "play_stream"        -- 流式播放音频,仅支持PCM 格式,可以将音频推流到云端,用来对接大模型或者流式录音的应用。
require "record_file"        -- 录音到文件
-- require "record_stream"        -- 流式录音   

-- 音频对内存影响较大,不断的打印内存,用于判断是否异常
sys.timerLoopStart(function()
    log.info("mem.lua", rtos.meminfo())
    log.info("mem.sys", rtos.meminfo("sys"))
 end, 3000)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

2、play_file.lua: 播放音频文件,可支持 wav,amr,mp3 格式音频

--[[
@module  play_file
@summary 播放文件
@version 1.0
@date    2025.09.08
@author  梁健
@usage

本文件为播放文件的应用功能模块,核心业务逻辑为:
1、自动播放一个sample-6s.mp3音乐
2、点powerkey 按键进行音频切换,点击boot 按键停止音频播放
3、点击boot 按键停止音频播放
本文件没有对外接口,直接在main.lua中require "play_file"就可以加载运行;
]]

exaudio = require("exaudio")
local taskName = "task_audio"


-- 音频初始化设置参数,exaudio.setup 传入参数
local audio_setup_param ={
    model= "es8311",          -- 音频编解码类型,可填入"es8311","es8211"
    i2c_id = 0,          -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
    --Air8000开发板配置pa_ctrl 和dac_ctrl 
    pa_ctrl = 162,            -- 音频放大器电源控制管脚
    dac_ctrl = 164,           -- 音频编解码芯片电源控制管脚
    --Air8000核心板配置pa_ctrl 和dac_ctrl 
    -- pa_ctrl = 17,            -- 音频放大器电源控制管脚
    -- dac_ctrl = 16,           -- 音频编解码芯片电源控制管脚  
}


--  播放结束回调
local function play_end(event)
    if event == exaudio.PLAY_DONE then
        log.info("播放完成",exaudio.is_end())
    end
end

--  音频播放的配置
local audio_play_param ={
    type= 0,                -- 播放类型,有0,播放文件,1.播放tts 2. 流式播放
                            -- 如果是播放文件,支持mp3,amr,wav格式
                            -- 如果是tts,内容格式见:https://wiki.luatos.com/chips/air780e/tts.html?highlight=tts
                            -- 流式播放,仅支持PCM 格式音频,如果是流式播放,则sampling_rate, sampling_depth,signed_or_unsigned 必填写
    content = "/luadb/sample-6s.mp3",          -- 如果播放类型为0时,则填入string 是播放单个音频文件,如果是表则是播放多段音频文件。
    cbfnc = play_end,            -- 播放完毕回调函数
}


---------------------------------
---通过BOOT 按键进行播放停止操作---
---------------------------------
local function stop_audio()
    log.info("停止播放")
    sys.sendMsg(taskName, MSG_KEY_PRESS, "STOP_AUDIO")
end
--按下boot 停止播放
gpio.setup(0, stop_audio, gpio.PULLDOWN, gpio.RISING)
gpio.debounce(0, 200, 1) -- 防抖,防止频繁触发

---------------------------------
---通过POWERKEY按键进行音频切换---
---------------------------------

local function next_audio()
    log.info("切换播放")
    sys.sendMsg(taskName, MSG_KEY_PRESS, "NEXT_AUDIO")
end

--按下powerkey 打断播放,播放优先级更高的音频
gpio.setup(gpio.PWR_KEY, next_audio, gpio.PULLUP, gpio.FALLING)
gpio.debounce(gpio.PWR_KEY, 200, 1) -- 防抖,防止频繁触发


---------------------------------
-----主task,处理播放音频---------
---------------------------------


local index_number = 1
local audio_path = nil
local function audio_task()
    log.info("开始播放音频文件")
    if exaudio.setup(audio_setup_param) then
        exaudio.play_start(audio_play_param) -- 仅仅支持task 中运行
        while true do
            local msg = sys.waitMsg(taskName, MSG_KEY_PRESS)   -- 等待按键触发
            if msg[2] ==  "NEXT_AUDIO" then  

                if index_number %2 == 0 then     --  切换音频路径
                    audio_path = "/luadb/sample-6s.mp3"
                else
                    audio_path = "/luadb/10.amr"
                end

                exaudio.play_start({type= 0, content = audio_path,cbfnc = play_end,priority = index_number})
                index_number= index_number +1 
            elseif msg[2] ==  "STOP_AUDIO" then
                exaudio.play_stop()
            end 
        end
    end

end
sys.taskInitEx(audio_task, taskName)

3、play_stream: 流式播放音频,仅支持 PCM 格式

--[[
@module  play_stream
@summary 流式播放
@version 1.0
@date    2025.09.08
@author  梁健
@usage

本文件为流式播放应用功能模块,核心业务逻辑为:
1、创建一个播放流式音频task(task_audio)
2、创建一个模拟获取流式音频的task(audio_get_data)
3、此task通过流式传输不断向exaudio.play_stream_write填入播放的音频
4、播放task 不断播放传入流式音频
5、使用powerkey 按键进行音量减小,点击boot 按键进行音量增加
本文件没有对外接口,直接在main.lua中require "play_stream"就可以加载运行;
]]

exaudio = require("exaudio")


-- 音频初始化设置参数,exaudio.setup 传入参数
local audio_setup_param ={
    model= "es8311",          -- dac类型,可填入"es8311","es8211"
    i2c_id = 0,          -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
    --Air8000开发板配置pa_ctrl 和dac_ctrl 
    pa_ctrl = 162,            -- 音频放大器电源控制管脚
    dac_ctrl = 164,           -- 音频编解码芯片电源控制管脚
    --Air8000核心板配置pa_ctrl 和dac_ctrl 
    -- pa_ctrl = 17,            -- 音频放大器电源控制管脚
    -- dac_ctrl = 16,           -- 音频编解码芯片电源控制管脚  
}

-- 播放完成回调
local function play_end(event)
    if event == exaudio.PLAY_DONE then
        log.info("播放完成",exaudio.is_end())

    end
end 

-- 流式播放音频播放的配置
local audio_play_param ={
    type= 2,                -- 播放类型,有0,播放文件,1.播放tts 2. 流式播放
                            -- 如果是播放文件,支持mp3,amr,wav格式
                            -- 如果是tts,内容格式见:https://wiki.luatos.com/chips/air780e/tts.html?highlight=tts
                            -- 流式播放,仅支持PCM 格式音频,如果是流式播放,则sampling_rate, sampling_depth,signed_or_unsigned 必填写
    cbfnc = play_end,            -- 播放完毕回调函数
    sampling_rate = 16000,  -- 采样率,仅为流式播放起作用
    sampling_depth =  16,   -- 采样位位深,仅流式播放的时候才有作用
    signed_or_unsigned = true  -- PCM 的数据是否有符号,仅为流式播放起作用
}

---------------------------------
---通过BOOT 按键增大音量---
---------------------------------
local volume_number = 50 
local function add_volume()
    volume_number = volume_number + 20
    log.info("增大音量",volume_number)
    exaudio.vol(volume_number)
end

gpio.setup(0, add_volume, gpio.PULLDOWN, gpio.RISING)
gpio.debounce(0, 200, 1)

---------------------------------
---通过POWERKEY按键减小音量-------
---------------------------------

local function down_volume()
    volume_number = volume_number - 15
    log.info("减小音量",volume_number)
    exaudio.vol(volume_number)
end

gpio.setup(gpio.PWR_KEY, down_volume, gpio.PULLUP, gpio.FALLING)
gpio.debounce(gpio.PWR_KEY, 200, 1)   -- 防抖,防止频繁触发


---------------------------------
---------模拟获取音频task---------
---------------------------------
local function audio_get_data()
    log.info("开始流式获取音频数据")
    local file = io.open("/luadb/test.pcm", "rb")   -- 模拟流式播放音源,实际的音频数据来源也可以来自网络或者本地存储
    while true do
        local read_data = file:read(4096)  --  读取文件,模拟流式音频源,需要1024 的倍数
        if read_data  == nil then
            file:close()                -- 模拟音频获取完毕,关闭音频文件
            break
        end
        exaudio.play_stream_write(read_data)  -- 流式写入音频数据
        sys.wait(100)                   -- 写数据需要留出事件给其他task 运行代码
    end
end

sys.taskInitEx(audio_get_data, "audio_get_data")


---------------------------------
------------通过主task------------
---------------------------------
local taskName = "task_audio"
local function audio_task()
    log.info("开始流式播报")
    if exaudio.setup(audio_setup_param) then
        exaudio.play_start(audio_play_param)
        log.info("播放状态",exaudio.is_end())
    end
end

sys.taskInitEx(audio_task, taskName)

4、play_tts: 支持文字转普通话输出需要固件支持

--[[
@module  play_tts
@summary 文字转语音
@version 1.0
@date    2025.09.08
@author  梁健
@usage

本文件为流式播放应用功能模块,核心业务逻辑为:
1、播放一个TTS
2、点powerkey 按键进行tts 的音色切换
3、点击boot 按键停止音频播放
本文件没有对外接口,直接在main.lua中require "play_tts"就可以加载运行;
]]
exaudio = require("exaudio")
local taskName = "task_audio"

-- 音频初始化设置参数,exaudio.setup 传入参数
local audio_setup_param ={
    model= "es8311",          -- 音频编解码类型,可填入"es8311","es8211"
    i2c_id = 0,          -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
    --Air8000开发板配置pa_ctrl 和dac_ctrl 
    pa_ctrl = 162,            -- 音频放大器电源控制管脚
    dac_ctrl = 164,           -- 音频编解码芯片电源控制管脚
    --Air8000核心板配置pa_ctrl 和dac_ctrl 
    -- pa_ctrl = 17,            -- 音频放大器电源控制管脚
    -- dac_ctrl = 16,           -- 音频编解码芯片电源控制管脚     
}

local function play_end(event)
    if event == exaudio.PLAY_DONE then
        log.info("播放完成",exaudio.is_end())
        exaudio.play_stop()
    end
end 

local audio_play_param ={
    type= 1,                -- 播放类型,有0,播放文件,1.播放tts 2. 流式播放
                            -- 如果是播放文件,支持mp3,amr,wav格式
                            -- 如果是tts,内容格式见:https://docs.openluat.com/air780epm/common/tts/
                            -- 流式播放,仅支持PCM 格式音频,如果是流式播放,则sampling_rate, sampling_depth,signed_or_unsigned 必填写
    content = "支付宝到账,1千万元",          -- 如果播放类型为0时,则填入string 是播放单个音频文件,如果是表则是播放多段音频文件。
    cbfnc = play_end,            -- 播放完毕回调函数
}


---------------------------------
---通过BOOT 按键进行播放停止操作---
---------------------------------
local function stop_audio()
    log.info("停止播放")
    sys.sendMsg(taskName, MSG_KEY_PRESS, "STOP_AUDIO")
end
--按下boot 停止播放
gpio.setup(0, stop_audio, gpio.PULLDOWN, gpio.RISING)
gpio.debounce(0, 200, 1)

---------------------------------
---通过POWERKEY按键进行音频切换---
---------------------------------

local function next_audio()
    log.info("切换播放")
    sys.sendMsg(taskName, MSG_KEY_PRESS, "NEXT_AUDIO")
end

--按下powerkey 打断播放,播放优先级更高的音频
gpio.setup(gpio.PWR_KEY, next_audio, gpio.PULLUP, gpio.FALLING)
gpio.debounce(gpio.PWR_KEY, 200, 1)  -- 防抖,防止频繁触发


---------------------------------------------------------------------------------------------------
---------------主task------------------------------------------------------------------------------
--- 关于TTS 音色设置请见: https://docs.openluat.com/air780epm/common/tts/
---------------------------------------------------------------------------------------------------


local index_number = 1
local audio_path = nil
local function audio_task()
    log.info("开始播放TTS")
    if exaudio.setup(audio_setup_param) then
        exaudio.play_start(audio_play_param) -- 仅仅支持task 中运行
        while true do
            local msg = sys.waitMsg(taskName, MSG_KEY_PRESS)   -- 等待按键触发
            if msg[2] ==  "NEXT_AUDIO" then      
                if index_number %5 == 0 then     --  切换播报音色
                    audio_path = "[m51]支付宝到账,1千万元"   -- 许久
                elseif index_number %5 == 1 then
                    audio_path = "[m52]支付宝到账,1千万元"   -- 许多
                elseif index_number %5 == 2 then
                    audio_path = "[m53]支付宝到账,1千万元"   -- 晓萍
                elseif index_number %5 == 3 then                    
                    audio_path = "[m54]支付宝到账,1千万元"   -- 唐老鸭
                elseif index_number %5 == 4 then                    
                    audio_path = "[m55]支付宝到账,1千万元"   -- 许宝宝 
                end

                exaudio.play_start({type= 1, content = audio_path,cbfnc = play_end,priority = index_number})
                index_number= index_number +1 
            elseif msg[2] ==  "STOP_AUDIO" then
                exaudio.play_stop()
            end 
        end
    end

end
sys.taskInitEx(audio_task, taskName)

5、record_file: 录音到文件,仅支持 PCM 格式

--[[
@module  record_file
@summary 录音到文件
@version 1.0
@date    2025.09.08
@author  梁健
@usage

录音到文件,核心业务逻辑为:
1、主程序录音到/record.amr 文件
2、使用powerkey 按键进行录音音量减小
3、点击boot 按键进行录音音量增加
本文件没有对外接口,直接在main.lua中require "record_file"就可以加载运行;
]]
exaudio = require("exaudio")

-- 音频初始化设置参数,exaudio.setup 传入参数
local audio_setup_param ={
    model= "es8311",          -- dac类型,可填入"es8311","es8211"
    i2c_id = 0,          -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
    --Air8000开发板配置pa_ctrl 和dac_ctrl 
    pa_ctrl = 162,            -- 音频放大器电源控制管脚
    dac_ctrl = 164,           -- 音频编解码芯片电源控制管脚
    --Air8000核心板配置pa_ctrl 和dac_ctrl 
    -- pa_ctrl = 17,            -- 音频放大器电源控制管脚
    -- dac_ctrl = 16,           -- 音频编解码芯片电源控制管脚  
    bits_per_sample = 16  -- 录音的位深,可选8,16,24 位,但是当选择音频格式为AMR_NB,自动调节为8位,当音频格式为AMR_WB,自动调节为16位
}
local recordPath = "/record.amr"

-- 录音完成回调
local function record_end(event)
    if event == exaudio.RECORD_DONE then
        log.info("录音后文件大小",io.fileSize(recordPath))
    end
end 

-- 录音配置参数,exaudio.record_start 的入参
local audio_record_param ={
    format= exaudio.PCM_32000,    -- 录制格式,有exaudio.AMR_NB,exaudio.AMR_WB,exaudio.PCM_8000,exaudio.PCM_16000,exaudio.PCM_24000,exaudio.PCM_32000
                                  -- 如果选择exaudio.AMR_WB,则需要固件支持volte 功能
    time = 5,               -- 录制时间,单位(秒)
    path = recordPath,             -- 如果填入的是字符串,则表示是文件路径,录音会传输到这个路径里
                                   -- 如果填入的是函数,则表示是流式录音,录音的数据会传输到此函数内,返回的是zbuf地址,以及数据长度
                                   -- 如果是流式录音,则仅支持PCM 格式 
    cbfnc = record_end,            -- 录音完毕回调函数
}


---------------------------------
---通过BOOT 按键增大录音---
---------------------------------
local volume_number = 50 
local function add_volume()
    volume_number = volume_number + 20
    log.info("增大录音音量",volume_number)
    exaudio.mic_vol(volume_number)
end
--按下boot 停止播放
gpio.setup(0, add_volume, gpio.PULLDOWN, gpio.RISING)
gpio.debounce(0, 200, 1)

---------------------------------
---通过POWERKEY按键减小录音-------
---------------------------------

local function down_volume()
    volume_number = volume_number - 15
    log.info("减小录音音量",volume_number)
    exaudio.mic_vol(volume_number)
end

gpio.setup(gpio.PWR_KEY, down_volume, gpio.PULLUP, gpio.FALLING)
gpio.debounce(gpio.PWR_KEY, 200, 1)   -- 防抖,防止频繁触发

---------------------------------
---音频 task 初始化函数-----------
---------------------------------
local taskName = "task_audio"
local function audio_task()
    sys.wait(100)
    log.info("开始录制音频到文件")
    if exaudio.setup(audio_setup_param) then
        exaudio.record_start(audio_record_param)
    end
end

sys.taskInitEx(audio_task, taskName)

6、record_stream: 流式录音,仅支持 PCM

--[[
@module  record_stream
@summary 流式录音
@version 1.0
@date    2025.09.08
@author  梁健
@usage

流式录音(仅支持PCM),核心业务逻辑为:
1、主程序录音进行流式录音
2、录音过程中不断的进行recode_data_callback回调,回调内容为音频流的地址和长度
本文件没有对外接口,直接在main.lua中require "record_stream"就可以加载运行;
]]
exaudio = require("exaudio")

-- 音频初始化设置参数,exaudio.setup 传入参数
local audio_setup_param ={
    model= "es8311",          -- dac类型,可填入"es8311","es8211"
    i2c_id = 0,          -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
    --Air8000开发板配置pa_ctrl 和dac_ctrl 
    pa_ctrl = 162,            -- 音频放大器电源控制管脚
    dac_ctrl = 164,           -- 音频编解码芯片电源控制管脚
    --Air8000核心板配置pa_ctrl 和dac_ctrl 
    -- pa_ctrl = 17,            -- 音频放大器电源控制管脚
    -- dac_ctrl = 16,           -- 音频编解码芯片电源控制管脚  
    bits_per_sample = 16  -- 录音的位深,可选8,16,24 位,但是当选择音频格式为AMR_NB,自动调节为8位,当音频格式为AMR_WB,自动调节为16位
}

-- 录音的数据流回调函数,注意不可以在回调函数中加入耗时和延迟的操作
local function  recode_data_callback(addr,data_len)
    log.info("收到音频流,地址为:",addr,"有效数据长度为:",data_len)
end
local function record_end(event)
    if event == exaudio.RECORD_DONE then
        log.info("录音完成")
    end
end 

-- 录音配置参数,exaudio.record_start 的入参
local audio_record_param ={
    format= exaudio.PCM_16000,    -- 录制格式,有exaudio.AMR_NB,exaudio.AMR_WB,exaudio.PCM_8000,exaudio.PCM_16000,exaudio.PCM_24000,exaudio.PCM_32000
    time = 5,               -- 录制时间,单位(秒)
    path = recode_data_callback,             -- 如果填入的是字符串,则表示是文件路径,录音会传输到这个路径里
                                        -- 如果填入的是函数,则表示是流式录音,录音的数据会传输到此函数内,返回的是zbuf地址,以及数据长度
                                        -- 如果是流式录音,则仅支持PCM 格式 
    cbfnc = record_end,            -- 录音完毕回调函数
}



local taskName = "task_audio"
local function audio_task()
    log.info("开始流式录制音频到文件")
    if exaudio.setup(audio_setup_param) then
        exaudio.record_start(audio_record_param)
    end
end

sys.taskInitEx(audio_task, taskName)

七、运行结果展示

1、play_file.lua: 播放音频文件,可支持 wav,amr,mp3 格式音频

2、play_stream: 流式播放音频,仅支持 PCM 格式

3、play_tts: 支持文字转普通话输出需要固件支持

4、record_file: 录音到文件,仅支持 PCM 格式

5、record_stream: 流式录音,仅支持 PCM

八、总结

本文演示了如何使用 Air8000 开发板或者 Air8000 核心板 +AirAUDIO_1010 音频配件板,实现完整的音频处理功能,涵盖了音频文件播放、流式播放、TTS 语音合成以及文件录音和流式录音两种录音模式,为开发各类语音应用提供了灵活的硬件基础和软件解决方案。

九、常见问题

1. 音频播放没有声音怎么办? 检查硬件连接是否正确、确认喇叭是否工作正常、检查音频配件板的供电和使能引脚配置是否正确、验证 GPIO 管脚配置是否正确。

2. TTS 播放没有声音怎么办? 确认所使用的固件是否支持 TTS 功能、检查 TTS 播放流程是否正常触发。

3. 录音功能无法工作怎么办? 确认麦克风硬件连接正确且完好、检查录音参数格式设置是否支持、确保存储空间充足。

4. 流式播放或录音过程中中断怎么办? 检查数据缓冲区管理逻辑确保数据持续供给、确认播放与录音的采样率及格式设置一致、优化系统任务调度避免阻塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值