声音测量仪使用指导

← 返回声音测量仪组件参考 · 全部使用指导

声音测量仪使用指导

工作原理

声音测量仪打开手机麦克风,每 2048 个采样(约 46 毫秒)分析一次:

  • 分贝:算出这段声音的均方根,换算成分贝,再加「校准偏移」(默认 90)。手机麦克风没有出厂校准,测出的是近似值,用来比较「哪里更吵、什么时候更吵」很准确;要接近专业分贝计,就在同一位置对比后调「校准偏移」。
  • 音高:用 YIN 算法(调音器常用的方法)找出声音的基本频率,再换算成最接近的音名(A4 = 440Hz,十二平均律)和音分偏差。声音低于「静音阈值」(默认 40 分贝)或没有明确音高(噪声、杂音)时不报,避免乱跳。

两个事件都按「事件间隔」(默认 200 毫秒)触发;App 退到后台自动停止录音,回到前台自动恢复。全部在手机上计算,不联网、不上传声音。

快速上手

拖一个声音测量仪和两个标签到屏幕。把「启用」设为真就开始测量(第一次会请求录音权限):

when Screen1.Initialize() {
  声音测量仪1.Enabled = true
}
when 声音测量仪1.SoundLevelChanged(分贝) {
  标签_分贝.Text = join(round(分贝), " 分贝")
}
when 声音测量仪1.PitchDetected(频率, 音名, 音分偏差) {
  标签_音名.Text = join(音名, "  ", round(频率), " Hz")
}

案例一:噪音计

按分贝分档显示等级,并用颜色提醒:40 分贝以下像图书馆,60 以下是正常交谈,80 以下像马路,再往上要注意保护听力。拖动滑动条可以调「校准偏移」:

when 声音测量仪1.SoundLevelChanged(分贝) {
  标签_分贝.Text = join(round(分贝), " 分贝")
  if 分贝 < 40 {
    标签_等级.Text = "安静(图书馆)"
    标签_分贝.TextColor = &HFF2E7D32
  } else if 分贝 < 60 {
    标签_等级.Text = "正常(交谈)"
    标签_分贝.TextColor = &HFF1565C0
  } else if 分贝 < 80 {
    标签_等级.Text = "吵闹(马路)"
    标签_分贝.TextColor = &HFFA65400
  } else {
    标签_等级.Text = "很吵,注意保护听力"
    标签_分贝.TextColor = &HFFBF360C
  }
}
when 滑动条_校准.PositionChanged(滑块位置) {
  声音测量仪1.CalibrationOffset = round(滑块位置)
  标签_校准.Text = join("校准偏移 ", round(滑块位置))
}

案例二:调音器

「检测到音高」直接给出音名和音分偏差:偏差在 ±10 音分以内算准,正数偏高、负数偏低。唱一个音,或者在吉他、尤克里里上弹一根空弦试试:

when 声音测量仪1.PitchDetected(频率, 音名, 音分偏差) {
  标签_音名.Text = 音名
  if 音分偏差 > 10 {
    标签_音准.Text = join(round(频率), " Hz,偏高 ", 音分偏差, " 音分")
  } else if 音分偏差 < -10 {
    标签_音准.Text = join(round(频率), " Hz,偏低 ", 0 - 音分偏差, " 音分")
  } else {
    标签_音准.Text = join(round(频率), " Hz,准")
  }
}

吉他六根空弦从粗到细是 E2、A2、D3、G3、B3、E4;尤克里里是 G4、C4、E4、A4。

案例三:吹口哨计数

口哨是频率很高(通常 1000Hz 以上)、音高很纯的声音,正好用来做声控:频率超过 1000Hz 且够响就算吹了一声。用一个「口哨中」标记,等声音落下去再允许下一次,一声口哨只记一次:

global 口哨次数 = 0
global 口哨中 = false
when 声音测量仪1.PitchDetected(频率, 音名, 音分偏差) {
  if 频率 > 1000 and 声音测量仪1.Decibels > 55 and not(口哨中) {
    口哨中 = true
    口哨次数 = 口哨次数 + 1
    标签_口哨.Text = join("口哨次数:", 口哨次数)
  }
}
when 声音测量仪1.SoundLevelChanged(分贝) {
  if 分贝 < 50 {
    口哨中 = false
  }
}

把计数换成「切换下一张图」「让精灵跳一下」,就是一个吹口哨控制的小游戏。拍手是很短的响声、没有明确音高,可以改用「分贝突然超过 75」来判断。

常见问题

现象 原因与处理
一直不触发事件 「启用」没有设为真,或拒绝了录音权限;在系统设置里给 App 开启麦克风权限后再试
分贝和专业分贝计差很多 手机麦克风没有出厂校准;在同一位置对比,把差值加到「校准偏移」
音高乱跳或不出来 声音太小(低于「静音阈值」)或杂音太多;靠近手机,或调低「静音阈值」
低音弦测不准 最低能测约 43Hz;低音提琴、贝斯最低音可能测成高八度,看音名的字母即可
录音时其它 App 也在用麦克风 同一时间只能有一个 App 录音,关掉其它录音、通话后再开始
切到后台就停了 这是有意的:后台不占用麦克风,回到前台自动恢复

平台说明

安卓和鸿蒙都完整支持,算法相同,同一段声音测出的分贝和音高一致。鸿蒙第一次使用同样会请求麦克风权限。

完整 .aia 源码与操作指导

下载 .aia 源码

导入 SoundMeterDemo.aia 后可以连接 AI 伴侣调试,或直接打包 APK。源码文件已通过正式编辑器载入、后台导入和 APK 编译校验;真机测量效果请以实际设备为准。

功能 操作 预期结果
开始测量 点「开始测量」,允许录音权限 大字实时显示分贝,下方显示安静 / 正常 / 吵闹 / 很吵
校准 拖动「校准偏移」滑动条 显示的分贝整体变大或变小
调音 唱「啦」或弹一根弦 显示音名(如 A4)和频率,偏差在 ±10 音分内显示「准」
吹口哨 对着手机吹一声口哨 口哨次数加一,一声只记一次
停止 点「停止」 麦克风关闭,分贝显示复位

案例界面与积木源码在仓库 docs/markdown/reference/components/guide/examples/SoundMeterDemo/,SHA-256:ea5e030894e9874205e1f50526207d2f5b6c104d1488bf82e2243f2915e55d90。

文档反馈