模拟语音¶
作者:许文婷
概述¶
Air724UG 内置3种音频输出模式,分别为扬声器(SPK)输出,耳机(HP)输出和听筒(RECEIVER)输出,详细模拟音频管脚定义如下:
管脚定义¶
管脚名 |
管脚号 |
I/O |
管脚描述 |
电气特性 |
备注 |
---|---|---|---|---|---|
SPK- |
18 |
O |
Speaker差 分信号输出 ,可以直接 驱动8欧姆Sp eaker,最大 输出功率1W |
||
SPK+ |
19 |
O |
|||
EAR_P |
101 |
O |
听筒输出 |
||
EAR_N |
102 |
O |
|||
HP_R |
103 |
O |
耳机输出 |
||
HP_L |
112 |
O |
|||
MIC- |
21 |
I |
麦克 输入,已内 置偏置电路 |
||
MIC+ |
22 |
I |
|||
HEADMIC_N |
104 |
I |
麦克输入 ,需要加外 部偏置电路 |
||
HEADMIC_P |
113 |
I |
|||
H EADMIC_BIAS |
114 |
O |
给HEADMIC 提 供偏置电压 |
||
HEA DMIC_IN_DET |
105 |
I |
耳 机按键检测 |
||
HP_DET |
106 |
I |
耳 机插入检测 |
参考设计¶
耳机参考电路¶
耳机参考电路一: 上图是目前Air724UG
的开发板上采用的耳机接口电路: HEADMIC_BIAS 给耳机麦克提供偏置电压;
HEADMIC_IN_DET 用来检测耳机按键,HEADMIC_IN_DET 内部是一个ADC,故 HEADMIC_IN_DET 还可以支持多功能按键;
HP_DET 用来检测耳机插入,当耳机插入时为低,当耳机拔出时为高;
这个耳机电路存在一个弊端,由于耳机拔出后需要给22uF电容充电后HP_DET 才能为高,导致耳机拔出检测会延迟6-10秒左右的时间,故推荐将耳机电路修改成下面的参考电路二
耳机参考电路二:
更换了耳机插座的型号,换成检测管脚是常开类型的耳机插座;
未插入耳机时,耳机插座的 Pin3 和 Pin4 之间处于断开状态,HP_DET 由内部拉高,为高电平;
插入耳机后,耳机插座的 Pin3 和 Pin4 之间导通,并连接到左声道的耳机喇叭,左声道的耳机喇叭等效于32欧姆的接地电阻,故 HP_DET 被拉低变成低电平;
拔出耳机后,耳机插座的 Pin3 和 Pin4 之间断开,因为不需要给22uF 的电容充电,HP_DET 马上变成了高电平,不会出现耳机拔出检测过慢的问题。
耳机种类¶
耳机根据第3段和第4段的接线定义不同可以分为 国标OMTP 和 美标CTIA 两种,在设计耳机插座的电路后需要选择相应的耳机。 Air724UG 的开发板是按照国标OMTP设计的,故只能使用 OMTP标准的耳机。
耳机接口类型推荐¶
注意: 1.NO: Normally-open type(常开型)
2.Headmic_in用于检测耳机类型,也可在耳机插入时使用。
HP_DET level
logic:
Headset |
Plug out |
Plug in |
---|---|---|
HP_DET |
1 |
0 |
SPK 参考电路¶
注意: 1. 磁珠和电容必须同时使用,如果没有EMI问题可以删除
2. 47pf可以换成TVS/MLV,用于解决ESD问题。
3. SPK通路默认是classD的输出,如果外接音频功会有噪音。
Receiver参考电路¶
注意: 1.R3111和R3112可以换成磁珠用于抑制RF干扰
2. C3126是用于射频噪声滤波和差模噪声抑制
3. C3127、C3128用于抑制射频干扰。需要通过一个单独的过孔直接连接到主GND。
外接PA参考设计¶
Air724UG内置3种音频输出模式可通过AT指令进行切换。扬声器(SPK)输出,耳机(HP)输出和听筒(RECEIVER)输出,都可以作为外部PA的功放输入端,用户可以根据使用的外接PA的规格进行设计。建议外接差分输入功放优先使用(RECEIVER)通道,如果是单端方式建议使用耳机右声道(HP_R) 以艾为的AW8733A为例,参考设计如下:
该芯片中INN,INP分别为功放的负输入端和功放的正输入端。与模块参考连接方式如下:
推荐使用差分输入方式,使用SPK通道作为驱动时,外部PA的INN连接模块SPK-,INP连接SPK+;
使用听筒(RECEIVER)通道作为驱动时,外部PA的INN连接模块的EAR_N,INP连接EAR_P。建议外接功放优先使用(RECEIVER)通道
注意: 1.耳机通道只可作为单端输入使用,推荐使用耳机右声道(HP_R)。
2. 如果用SPK通道外接功放需要切换成classAB的输出方式:audiocore.setpa(audiocore.CLASS_AB)
AT版本相关控制指令¶
##TTS(Text To Speech)功能:AT+CTTS 语法规则
命令类型 |
语法 |
返回 |
---|---|---|
设置命令 |
AT+CTTS=[,] |
OK |
查询指令 |
AT+CTTS? |
+CTTS: |
OK |
||
测试命令 |
AT+CTTSPARAM=? |
OK |
URC |
当 TTS 播放完毕,会有以下 URC 上报:+CTTS:0 |
参数定义
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
TTS工作模式 |
0 |
停止播放TTS |
|
1 |
播放TTS,使用UCS2编码 |
||
2 |
播放TTS,使用GBK编码(中文)和ASCII编码(数字) |
||
TTS文本 |
中文和数字 |
||
TTS工作状态 |
0 |
TTS非播放状态 |
|
1 |
TTS播放状态 |
举例
命令(→)/返回(←) |
实例 |
解释和说明 |
---|---|---|
→ |
AT+CTTS= 2,“123,欢迎你的到来” |
播放数字和中文。注: 1.目前暂时无法播放英 文,中的英文发音不是 单词,而是一个一个分 离的字母。2.AT版本124 9之后支持通话中向对端 播放TTS,只需要在通话 过程中调用AT+CTTS即可 |
← |
OK |
|
←(URC) |
+CTTS:0 |
播放 完毕,会有这个URC上报 |
→ |
AT+CTTS=0 |
也可以在播放过程 中用这个命令终止播放 |
← |
OK |
##设置 TTS 播放参数: AT+CTTSPARAM
语法规则
命令类型 |
语法 |
返回 |
---|---|---|
设置命令 |
AT+CTTSPARAM=,,,[,] |
OK |
查询指令 |
AT+CTTSPARAM? |
+CTTSPARAM:,,, , OK |
测试命令 |
AT+CTTSPARAM=? |
OK |
参数定义
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
TTS播放音量 |
0-100 |
缺省值为50 |
|
TTS播 放模式,range: 0-3 |
0 |
auto read digit, and read digit based on number rule first |
|
1 |
auto read digit, and read digit based on telegram rule first |
||
2 |
read digit based on telegram rule |
||
3 |
read digit based on number rule |
||
TTS播放音高 |
1-100 |
缺省值为50 |
|
TTS播放速度 |
1-100 |
缺省值为50 |
|
TTS播放通道 |
0 |
main channel |
|
1 |
aux channel |
##语音文件播放: AT+CAUDPLAY
语法规则:
命令类型 |
语法 |
返回 |
---|---|---|
设置命令 |
AT+CAUDPLAY=[,] |
OK |
查询命令 |
AT+CAUDPLAY? |
+CAUDPLAY: |
OK |
||
测试命令 |
AT+CAUDPLAY=? |
+CAUDPLAY: (取值范围列表), |
OK |
参数定义:
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
使用模式 |
1 |
开始播放(start) |
|
2 |
停止播放(stop) |
||
3 |
暂停播放(pause) |
||
4 |
恢复播放(resume) |
||
音频文件名字 |
PCM,WAV,MP3。 需要加后缀 |
** 举例:**
命令(→)/ 返回(←) |
实例 |
解释和说明 |
---|---|---|
→ |
A T+FSCREATE=“111.mp3” |
创建音频文件 |
← |
OK |
|
→ |
AT+FSWRITE =“111.mp3”,0,6314,20 |
输入音频文件。 这 里长度6314只是举例, 请以实际为准 |
← |
> |
收到该指令后发送数据 |
← |
OK |
|
→ |
AT+ CAUDPLAY=1,“111.mp3” |
播放音频文件 注: 音 频文件名字需要加后缀 |
← |
OK |
|
→ |
AT+CAUDPLAY=3 |
暂停播放 |
← |
OK |
|
→ |
AT+CAUDPLAY=4 |
恢复播放 |
← |
OK |
|
→ |
AT+CAUDPLAY=2 |
终止播放 |
← |
OK |
语音通道切换: AT+AUDCH¶
语法规则:
命令类型 |
语法 |
返回 |
---|---|---|
设置命令 |
AT+AUDCH=, |
OK |
查询命令 |
AT+AUDCH? |
+AUDCH: , |
OK |
||
测试命令 |
AT+AUDCH=? |
+AUDCH: (range of s,list ofs) |
OK |
** 参数定义: **
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
音频输出通道 |
0 |
通道 0, 听筒(receiver) |
|
1 |
通道 1, 耳机(headphone) |
||
2 |
通道 2, 喇叭(speaker) |
||
音频输入通道 |
0 |
main mic |
|
1 |
auxilary mic |
||
2 |
headphone mic left |
||
3 |
headphone mic right |
RECEIVER 音量控制: AT+CLVL¶
** 语法规则:**
命令类型 |
语法 |
返回 |
---|---|---|
设置命令 |
AT+CLVL= |
OK |
查询命令 |
AT+CLVL? |
+CLVL: |
OK |
||
测试命令 |
AT+CLVL=? |
+CLVL: (取值范围) |
OK |
参数定义:
参数 |
定义 |
取值 |
对取值的定义 |
---|---|---|---|
音量等级 |
0~100 |
0 声音最小, 100 声音最大。 缺省值为 60 |
SPK 音量控制: AT+CRSL¶
** 语法规则:**
命令类型 |
语法 |
返回 |
---|---|---|
设置命令 |
AT+CRSL= |
OK |
查询命令 |
AT+CRSL? |
+CRSL: |
OK |
||
测试命令 |
AT+CRSL=? |
+CRSL: (取值范围) |
OK |
参数定义:
参数 |
定义 |
取值 |
对取值的定义 |
---|---|---|---|
音量等级 |
0~100 |
0 声音最小, 100 声音最大。 缺省值为 60 |
SPK 通道输出模式控制:AT+SPKPA=¶
注意:版本号要大于等于 1251,才支持此命令,需要重启生效
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
音频功放类型 |
0 |
CLASSAB |
|
1 |
CLASSD |
||
2 |
CLASSK |
举例:¶
AT+SPKPA=0
OK
AT+SPKPA?
+SPKSPA: 0
OK
LUAT开发相关接口¶
相关的audio控制接口可以参考LUAT_API AUDIO章节 相关示例,请参考:raw-latex:script_LuaTask_VX.X.X:raw-latex:demo:raw-latex:`\audio`
###audio.play 播放音频
语法
audio.play(priority,type,path,vol,cbFnc,dup,dupInterval)
参数
参数 |
释义 |
---|---|
priority |
音频优先级,数值越大,优先级越高 |
type |
音频类型,目前仅支 持“FILE”、“TTS”、“TTSCC”,“RECORD” |
path |
音 频文件路径,跟typ有关,typ为“FIL E”时:表示音频文件路径,typ为“TTS ”时:表示要播放的UTF8编码格式的数 据,typ为“TTSCC”时:表示要播放给 通话对端的UTF8编码格式的数据,ty p为“RECORD”时:表示要播放的录音id |
vol |
播放音量,取值范围0到7,0为静音 |
cbFnc |
音频播 放结束时的回调函数,cbFnc(result) |
dup |
是否循环播 放,true循环,false或者nil不循环 |
dupInterval |
循环播放间隔(单位 毫秒),dup为true时,此值才有意义 |
返回 无
停止音频播放
语法
audio.stop(cbFnc)
参数
参数 |
释义 |
---|---|
cbFnc |
停止音频播放的回调函数(停止 结果通过此函数通知用户),回调函数的调用形式为cbFnc(result) |
返回 无
###audio.setVolume 设置喇叭音量等级
语法
audio.setVolume(vol)
参数
参数 |
释义 |
---|---|
vol |
音量值为0-7,0为静音 |
返回 设置成功返回true,失败返回false
###audio.setCallVolume 设置通话音量等级
语法
audio.setCallVolume(vol)
参数
参数 |
释义 |
---|---|
vol |
音量值为0-7,0为静音 |
返回 设置成功返回true,失败返回false
###audio.setMicVolume 设置麦克音量等级
语法
audio.setMicVolume(vol)
参数
参数 |
释义 |
---|---|
vol |
音量值为0-15,0为静音 |
返回 设置成功返回true,失败返回false
###audio.getVolume 获取喇叭音量等级 - 语法 audio.getVolume()
返回 喇叭音量等级
###audio.getCallVolume 获取通话音量等级 - 语法 audio.getCallVolume()
返回 通话音量等级
获取麦克音量等级
语法
audio.getMicVolume(vol)
返回 麦克音量等级
###audio.setStrategy 设置优先级相同时的播放策略
语法
audio.setStrategy(strategy)
参数
参数 |
释义 |
---|---|
strategy |
优先级相同时的 播放策略;0:表示继续播放正在播放的音频,忽略请求播放的 新音频;1:表示停止正在播放的音频,播放请求播放的新音频 |
返回 nil
###audio.setTTSSpeed 设置TTS朗读速度 - 语法 audio.setTTSSpeed(speed)
参数
参数 |
释义 |
---|---|
speed |
速度范围为0-100,默认50 |
返回 设置成功返回true,失败返回false
###audio.setChannel 设置音频输出通道 - 语法 setChannel(channel)
参数
参数 |
释义 |
---|---|
channel |
1:headphone耳机 2:speaker喇叭 |
返回 nil
###audiocore.streamplay 向流播放管道中填充数据,具体用法参考demo_audio中的testAudioStream.lua
语法
audiocore.streamplay(StreamType,data)
参数
参数 |
释义 |
---|---|
StreamType |
audiocore.PCM |
audiocore.PCM |
|
audiocore.AMR |
|
audiocore.SPX |
|
audiocore.MP3 注:0021及之后版本才支持 |
|
data |
音频数据 |
返回 设置成功返回true,失败返回false
注:流播放结束后需要调用audiocore.stop手动停止播放
###audiocore.streamremain 查看流播放管道内剩余数据大小
语法
audiocore.streamremain()
参数 无
返回 返回管道内剩余数据大小
CSDK开发相关接口¶
具体接口定义参考CSDK中iot_audio.h ###iot_auido_open_tch 在通话中打开语音
语法
BOOL iot_auido_open_tch( VOID );
-参数 无
返回 TRUE: 成功, FALSE: 失败
###iot_audio_close_tch 通话结束时调用,关闭语音
语法
BOOL iot_audio_close_tch( VOID ) { return IVTBL(close_tch)(); }
参数 无
返回 成功返回TRUE,失败返回FALSE
###iot_audio_play_tone 播放TONE音
语法
BOOL iot_audio_play_tone(
E_AMOPENAT_TONE_TYPE toneType,
UINT16 duration,
E_AMOPENAT_SPEAKER_GAIN volume
);
参数
参数 |
释义 |
---|---|
toneType |
TONE音类型 |
duration |
播放时长 |
volume |
播放音量 |
返回 成功返回TRUE,失败返回FALSE
###iot_audio_stop_tone 停止播放TONE音
语法
BOOL iot_audio_stop_tone(
VOID
);
参数 无
返回 成功返回TRUE,失败返回FALSE
###iot_audio_play_dtmf
语法
BOOL iot_audio_play_dtmf(
E_AMOPENAT_DTMF_TYPE dtmfType,
UINT16 duration,
E_AMOPENAT_SPEAKER_GAIN volume
);
参数
参数 |
释义 |
---|---|
dtmfType |
DTMF类型 |
duration |
播放时长 |
volume |
播放音量 |
返回 成功返回TRUE,失败返回FALSE
###iot_audio_stop_dtmf 停止播放DTMF音 - 语法
BOOL iot_audio_stop_dtmf(
VOID
);
参数 无
返回 成功返回TRUE,失败返回FALSE
###iot_audio_play_music 播放音频
语法
BOOL iot_audio_play_music(T_AMOPENAT_PLAY_PARAM* playParam);
参数
参数 |
释义 |
---|---|
playParam |
播放参数 |
返回 成功返回TRUE,失败返回FALSE
###iot_audio_stop_music 停止音频播放
语法
BOOL iot_audio_stop_music(
VOID
);
参数 无
返回 成功返回TRUE,失败返回FALSE
###iot_audio_pause_music 暂停音频播放
语法
BOOL iot_audio_pause_music(
VOID
);
参数 无
返回 成功返回TRUE,失败返回FALSE
###iot_audio_resume_music 恢复音频播放 - 语法
BOOL iot_audio_resume_music(
VOID
);
参数 无
返回 成功返回TRUE,失败返回FALSE
###iot_audio_mute_speaker 设置扬声器静音
语法
BOOL iot_audio_mute_speaker(
VOID
);
参数 无
返回 成功返回TRUE,失败返回FALSE
###iot_audio_unmute_speaker 解除扬声器静音
语法
BOOL iot_audio_unmute_speaker(
VOID
);
参数 无
返回 成功返回TRUE,失败返回FALSE
###iot_audio_set_speaker_vol 设置扬声器的音量值 - 语法
BOOL iot_audio_set_speaker_vol(
UINT32 vol
);
参数
参数 |
释义 |
---|---|
vol |
设置扬声器音量值 |
返回 成功返回TRUE,失败返回FALSE
###iot_audio_get_speaker_vol 获取扬声器的音量值
语法
BOOL iot_audio_get_speaker_vol(
VOID
);
参数 无
返回 返回扬声器的音量值
###iot_audio_set_sph_vol 设置通话音量值 - 语法
BOOL iot_audio_set_sph_vol(
UINT32 vol
);
参数
参数 |
释义 |
---|---|
vol |
设置通话音量值 |
返回 成功返回TRUE,失败返回FALSE
###iot_audio_get_sph_vol 获取通话的音量值
语法
BOOL iot_audio_get_sph_vol(
VOID
);
参数 无
返回 返回通话的音量值
###iot_audio_set_channel 设置音频通道 - 语法
BOOL iot_audio_set_channel(
E_AMOPENAT_AUDIO_CHANNEL channel
);
参数
参数 |
释义 |
---|---|
channel |
音频通道 |
返回 成功返回TRUE,失败返回FALSE
###iot_audio_get_current_channel 获取当前通道 - 语法
E_AMOPENAT_AUDIO_CHANNEL iot_audio_get_current_channel(
VOID
);
参数 无
返回 返回当前通道
###iot_audio_rec_start 开始录音 - 语法
BOOL iot_audio_rec_start(
E_AMOPENAT_RECORD_PARAM* param,
AUD_RECORD_CALLBACK_T cb);
参数
参数 |
释义 |
---|---|
param |
录音参数 |
cb |
获取录音数据回调 |
返回 成功返回TRUE,失败返回FALSE
###iot_audio_rec_stop 停止录音 - 语法
BOOL iot_audio_rec_stop();
参数 无
返回 成功返回TRUE,失败返回FALSE
###iot_audio_streamplay 流播放 - 语法
int iot_audio_streamplay(E_AMOPENAT_AUD_FORMAT playformat,AUD_PLAY_CALLBACK_T cb,char* data,int len);
参数
参数 |
释义 |
---|---|
playformat |
数据流类型 |
cb |
数据流回调函数 |
data |
数据流 |
len |
数据流长度 |
返回 0: 播放长度 -1: 播放失败
相关资料以及购买链接¶
相关开发板购买链接 Air724UG开发板 Air724 开发板使用说明 相关软件资料下载
常见问题¶
https://luatdoc.papapoi.com/638/ * Q: spk的输出类型是什么? A:spk为差分输出,内部经过一个classD类功放 * Q: spk通道外接功放有噪音? A:spk通道默认是classD的输出, 如果用SPK通道外接功放需要切换成classAB的输出方式:lua(V22版本以及以以后的版本):audiocore.setpa(audiocore.CLASS_AB) AT: AT+SPKPA=0 需要重启生效 * Q: spk通道切换成classAB了但是单独方式接功放底噪偏大? A: SPK内部经过一级PA放大,外部再接功放时底噪会偏大。建议采用差分接法,如果只能采用单端接法,建议使用耳机右声道(HP_R)