@@ -15,19 +15,22 @@ public class AudioController : MonoBehaviour
15
15
private bool isVADRecording = false ;
16
16
private float silenceTimer = 0f ;
17
17
private int lastSamplePosition = 0 ;
18
+ private int lastVADSamplePosition = 0 ;
18
19
private List < float > vadAudioData = new List < float > ( ) ;
19
20
private AudioClip microphoneClip ;
20
21
private AudioSource audioSource ;
21
22
private bool isPlayingAudio = false ;
22
23
private bool cancelPending = false ;
23
24
private Queue < byte [ ] > audioBuffer = new Queue < byte [ ] > ( ) ;
24
- public static event Action < string > OnAudioRecorded ;
25
25
private string microphoneDevice ;
26
26
private bool ignoreInitialSpike = false ;
27
- public float currentVolumeLevel { get ; private set ; } = 0f ;
27
+ public float currentVolumeLevel = 0f ;
28
28
public float [ ] frequencyData { get ; private set ; }
29
29
public int fftSampleSize = 1024 ;
30
30
public float [ ] aiFrequencyData { get ; private set ; }
31
+ public static event Action < string > OnAudioRecorded ;
32
+ public static event Action OnVADRecordingStarted ;
33
+ public static event Action OnVADRecordingEnded ;
31
34
32
35
private void Start ( )
33
36
{
@@ -64,10 +67,8 @@ private void Update()
64
67
65
68
public void StartRecording ( )
66
69
{
67
- if ( interruptResponseOnNewRecording )
68
- CancelAudioPlayback ( ) ;
69
- if ( Microphone . devices . Length == 0 )
70
- return ;
70
+ if ( interruptResponseOnNewRecording ) CancelAudioPlayback ( ) ;
71
+ if ( Microphone . devices . Length == 0 ) return ;
71
72
ResetCancelPending ( ) ;
72
73
microphoneDevice = Microphone . devices [ 0 ] ;
73
74
microphoneClip = Microphone . Start ( microphoneDevice , false , 10 , sampleRate ) ;
@@ -94,19 +95,15 @@ public void StopRecording()
94
95
95
96
public void StartMicrophone ( )
96
97
{
97
- if ( Microphone . devices . Length == 0 )
98
- return ;
98
+ if ( Microphone . devices . Length == 0 ) return ;
99
99
microphoneDevice = Microphone . devices [ 0 ] ;
100
100
microphoneClip = Microphone . Start ( microphoneDevice , true , 10 , sampleRate ) ;
101
101
lastSamplePosition = 0 ;
102
102
}
103
103
104
104
public void StopMicrophone ( )
105
105
{
106
- if ( Microphone . IsRecording ( microphoneDevice ) )
107
- {
108
- Microphone . End ( microphoneDevice ) ;
109
- }
106
+ if ( Microphone . IsRecording ( microphoneDevice ) ) Microphone . End ( microphoneDevice ) ;
110
107
frequencyData = null ;
111
108
}
112
109
@@ -158,143 +155,59 @@ private void UpdateCurrentVolumeAndFrequency()
158
155
lastSamplePosition = micPosition ;
159
156
}
160
157
158
+
161
159
private void PerformVAD ( )
162
160
{
163
- if ( ! Microphone . IsRecording ( microphoneDevice ) )
164
- {
165
- lastSamplePosition = Microphone . GetPosition ( microphoneDevice ) ;
166
- return ;
167
- }
168
- int micPosition = Microphone . GetPosition ( microphoneDevice ) ;
169
- int sampleDiff = micPosition - lastSamplePosition ;
170
- if ( sampleDiff < 0 )
171
- {
172
- sampleDiff += microphoneClip . samples ;
173
- }
174
- if ( sampleDiff == 0 )
175
- {
176
- return ;
177
- }
178
- float [ ] samples = new float [ sampleDiff ] ;
179
- int startPosition = lastSamplePosition ;
180
- if ( startPosition + sampleDiff <= microphoneClip . samples )
181
- {
182
- microphoneClip . GetData ( samples , startPosition ) ;
183
- }
184
- else
185
- {
186
- int samplesToEnd = microphoneClip . samples - startPosition ;
187
- int samplesFromStart = sampleDiff - samplesToEnd ;
188
- float [ ] samplesPart1 = new float [ samplesToEnd ] ;
189
- float [ ] samplesPart2 = new float [ samplesFromStart ] ;
190
- microphoneClip . GetData ( samplesPart1 , startPosition ) ;
191
- microphoneClip . GetData ( samplesPart2 , 0 ) ;
192
- Array . Copy ( samplesPart1 , 0 , samples , 0 , samplesToEnd ) ;
193
- Array . Copy ( samplesPart2 , 0 , samples , samplesToEnd , samplesFromStart ) ;
194
- }
195
- float maxVolume = 0f ;
196
- foreach ( var sample in samples )
197
- {
198
- float absSample = Mathf . Abs ( sample ) ;
199
- if ( absSample > maxVolume )
200
- {
201
- maxVolume = absSample ;
202
- }
203
- }
204
- currentVolumeLevel = maxVolume ;
205
- if ( maxVolume > vadThreshold )
161
+ if ( ! Microphone . IsRecording ( microphoneDevice ) ) return ;
162
+
163
+ if ( currentVolumeLevel > vadThreshold && ! isVADRecording )
206
164
{
207
165
silenceTimer = 0f ;
208
- if ( ignoreInitialMicrophoneFramesOnVAD )
209
- {
210
- if ( ignoreInitialSpike )
211
- {
212
- ignoreFrameCount ++ ;
213
- if ( ignoreFrameCount >= framesToIgnore )
214
- {
215
- ignoreInitialSpike = false ;
216
- ignoreFrameCount = 0 ;
217
- }
218
- }
219
- else
220
- {
221
- if ( ! isVADRecording )
222
- {
223
- StartVADRecording ( ) ;
224
- }
225
- AppendVADData ( samples ) ;
226
- }
227
- }
228
- else
229
- {
230
- if ( ! isVADRecording )
231
- {
232
- StartVADRecording ( ) ;
233
- }
234
- AppendVADData ( samples ) ;
235
- }
166
+ StartVADRecording ( ) ;
236
167
}
237
- else
168
+ else if ( isVADRecording )
238
169
{
239
- if ( isVADRecording )
240
- {
241
- silenceTimer += sampleDiff / ( float ) sampleRate ;
242
- if ( silenceTimer >= vadSilenceDuration )
243
- {
244
- StopVADRecording ( ) ;
245
- }
246
- else
247
- {
248
- AppendVADData ( samples ) ;
249
- }
250
- }
251
- else
252
- {
253
- if ( ignoreInitialMicrophoneFramesOnVAD )
254
- {
255
- ignoreInitialSpike = true ;
256
- ignoreFrameCount = 0 ;
257
- }
258
- }
170
+ silenceTimer += Time . deltaTime ;
171
+ if ( silenceTimer >= vadSilenceDuration ) StopVADRecording ( ) ;
259
172
}
260
- lastSamplePosition = micPosition ;
261
173
}
262
174
263
175
private void StartVADRecording ( )
264
176
{
177
+ if ( interruptResponseOnNewRecording && ! isVADRecording ) CancelAudioPlayback ( ) ;
178
+ ResetCancelPending ( ) ;
265
179
isVADRecording = true ;
266
- vadAudioData . Clear ( ) ;
267
- }
268
-
269
- private void AppendVADData ( float [ ] samples )
270
- {
271
- vadAudioData . AddRange ( samples ) ;
180
+ silenceTimer = 0f ;
181
+ microphoneClip = Microphone . Start ( microphoneDevice , false , 10 , sampleRate ) ;
182
+ OnVADRecordingStarted ? . Invoke ( ) ;
272
183
}
273
184
274
185
private void StopVADRecording ( )
275
186
{
276
- isVADRecording = false ;
277
- silenceTimer = 0f ;
278
- if ( vadAudioData . Count > 0 )
187
+ if ( Microphone . IsRecording ( microphoneDevice ) )
279
188
{
280
- float [ ] audioData = vadAudioData . ToArray ( ) ;
189
+ int micPosition = Microphone . GetPosition ( microphoneDevice ) ;
190
+ float [ ] audioData = new float [ micPosition ] ;
191
+ microphoneClip . GetData ( audioData , 0 ) ;
281
192
string base64AudioData = ConvertFloatToPCM16AndBase64 ( audioData ) ;
282
193
OnAudioRecorded ? . Invoke ( base64AudioData ) ;
283
194
}
284
- vadAudioData . Clear ( ) ;
195
+
196
+ isVADRecording = false ;
197
+ silenceTimer = 0f ;
198
+ OnVADRecordingEnded ? . Invoke ( ) ;
199
+
200
+ Microphone . End ( microphoneDevice ) ;
201
+ StartMicrophone ( ) ;
202
+
203
+ ignoreInitialSpike = true ;
285
204
}
286
205
287
206
public void EnqueueAudioData ( byte [ ] pcmAudioData )
288
207
{
289
- if ( cancelPending )
290
- {
291
- return ;
292
- }
208
+ if ( cancelPending ) return ;
293
209
audioBuffer . Enqueue ( pcmAudioData ) ;
294
- if ( ! isPlayingAudio )
295
- {
296
- PlayBufferedAudio ( ) ;
297
- }
210
+ if ( ! isPlayingAudio ) PlayBufferedAudio ( ) ;
298
211
}
299
212
300
213
private void PlayBufferedAudio ( )
0 commit comments