2
2
using System . IO ;
3
3
using UnityEngine ;
4
4
using System . Collections . Generic ;
5
+ using System . Linq ;
5
6
6
7
namespace Neocortex
7
8
{
8
9
public static class AudioClipExtensions
9
10
{
10
11
private const int HeaderSize = 44 ;
11
-
12
- public static AudioClip Trim ( this AudioClip audioClip , float treshold = 0.002f )
12
+
13
+ public static AudioClip Trim ( this AudioClip audioClip , float threshold = 0.001f )
13
14
{
14
15
float [ ] samples = new float [ audioClip . samples ] ;
15
16
audioClip . GetData ( samples , 0 ) ;
16
- List < float > sampleList = new List < float > ( samples ) ;
17
+ List < float > outputSamples = new List < float > ( ) ;
17
18
18
- sampleList . RemoveAll ( sample => Mathf . Abs ( sample ) < treshold ) ;
19
+ int silenceMinSamples = Mathf . RoundToInt ( audioClip . frequency * 0.2f ) ; // 0.2 seconds
19
20
20
- // if audio is shorter than 0.2 seconds, return null
21
- // this is to prevent sound such as mouse clicks from being sent
22
- if ( sampleList . Count < audioClip . frequency / 4 )
21
+ int i = 0 ;
22
+ while ( i < samples . Length )
23
23
{
24
- return null ;
24
+ if ( Mathf . Abs ( samples [ i ] ) < threshold )
25
+ {
26
+ int silentStart = i ;
27
+
28
+ while ( i < samples . Length && Mathf . Abs ( samples [ i ] ) < threshold )
29
+ {
30
+ i ++ ;
31
+ }
32
+
33
+ int silentLength = i - silentStart ;
34
+ if ( silentLength < silenceMinSamples )
35
+ {
36
+ for ( int j = silentStart ; j < i ; j ++ )
37
+ {
38
+ outputSamples . Add ( samples [ j ] ) ;
39
+ }
40
+ }
41
+ }
42
+ else
43
+ {
44
+ outputSamples . Add ( samples [ i ] ) ;
45
+ i ++ ;
46
+ }
25
47
}
26
48
27
- if ( sampleList . Count > 0 )
49
+ // Remove 0.2 or shorter loud segments, could mouse click etc
50
+ if ( outputSamples . Count <= silenceMinSamples )
28
51
{
29
- var lengthSamples = Mathf . Max ( sampleList . Count , audioClip . frequency ) ;
30
- var tempClip = AudioClip . Create ( "TempClip" , lengthSamples , audioClip . channels , audioClip . frequency , false ) ;
31
- tempClip . SetData ( sampleList . ToArray ( ) , 0 ) ;
32
-
33
- return tempClip ;
52
+ return null ;
34
53
}
35
54
36
- return null ;
37
- }
55
+ int lengthSamples = Mathf . Max ( outputSamples . Count , audioClip . frequency ) ;
56
+ AudioClip tempClip = AudioClip . Create ( "TempClip" , lengthSamples , audioClip . channels , audioClip . frequency , false ) ;
57
+ tempClip . SetData ( outputSamples . ToArray ( ) , 0 ) ;
38
58
59
+ return tempClip ;
60
+ }
61
+
39
62
public static byte [ ] EncodeToWav ( this AudioClip clip )
40
63
{
41
64
return Encode ( clip ) ;
@@ -47,6 +70,9 @@ private static byte[] Encode(AudioClip clip)
47
70
Convert ( memoryStream , clip ) ;
48
71
WriteHeader ( memoryStream , clip ) ;
49
72
byte [ ] bytes = memoryStream . GetBuffer ( ) ;
73
+
74
+ // Check out the result for audio quality
75
+ // File.WriteAllBytes(Application.persistentDataPath + "/input.wav", bytes);
50
76
51
77
return bytes ;
52
78
}
0 commit comments