Sub Process_Globals
Private audio As AudioStreamer
Private timer1 As Timer
Private bufferList As List
End Sub
Sub Globals
End Sub
Sub Activity_Create(FirstTime As Boolean)
audio.Initialize("audio", 16000, True, 16, audio.VOLUME_VOICE_CALL)
bufferList.Initialize
timer1.Initialize("timer1", 2000)
timer1.Enabled = True
audio.StartRecording
End Sub
Sub audio_RecordBuffer(Buffer() As Byte)
bufferList.Add(Buffer)
End Sub
Sub timer1_Tick
If bufferList.Size = 0 Then Return
Dim amplitudes As List
amplitudes.Initialize
For Each buf() As Byte In bufferList
amplitudes.Add(ComputeAmplitude(buf))
Next
bufferList.Clear
Dim avg As Float = Average(amplitudes)
Dim variance As Float = ComputeVariance(amplitudes, avg)
Log("Avg: " & avg & " Var: " & variance)
If avg > 1000 And variance > 500 Then
Log("👂 Possible human speech detected!")
' You could trigger an alert or record this timestamp
End If
End Sub
Sub ComputeAmplitude(buffer() As Byte) As Float
Dim raf As RandomAccessFile
Dim tmpfile As String = File.DirInternal & "/tmp.raw"
File.WriteBytes(tmpfile, "", buffer)
raf.Initialize2(File.DirInternal, "tmp.raw", False, True)
Dim samples As Int = raf.Size / 2
Dim total As Long = 0
For i = 0 To samples - 1
total = total + Abs(raf.ReadShort(i * 2))
Next
raf.Close
Return total / samples
End Sub
Sub Average(l As List) As Float
Dim sum As Float = 0
For Each f As Float In l
sum = sum + f
Next
Return sum / l.Size
End Sub
Sub ComputeVariance(l As List, avg As Float) As Float
Dim sumSq As Float = 0
For Each f As Float In l
sumSq = sumSq + Power(f - avg, 2)
Next
Return sumSq / l.Size
End Sub