Sky-Kim commited on
Commit
6ac63e1
·
1 Parent(s): aaffe5c

Initial commit

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +4 -0
  2. .gitignore +79 -0
  3. Assets/Models.meta +8 -0
  4. Assets/Models/ko-tiny.meta +8 -0
  5. Assets/Models/ko-tiny/decoder_model.onnx +3 -0
  6. Assets/Models/ko-tiny/decoder_model.onnx.meta +17 -0
  7. Assets/Models/ko-tiny/decoder_with_past_model.onnx +3 -0
  8. Assets/Models/ko-tiny/decoder_with_past_model.onnx.meta +17 -0
  9. Assets/Models/ko-tiny/encoder_model.onnx +3 -0
  10. Assets/Models/ko-tiny/encoder_model.onnx.meta +15 -0
  11. Assets/Plugins.meta +8 -0
  12. Assets/Plugins/Android.meta +5 -0
  13. Assets/Plugins/Android/AndroidManifest.xml +31 -0
  14. Assets/Plugins/Android/AndroidManifest.xml.meta +7 -0
  15. Assets/Plugins/Android/libten_vad.so.meta +2 -0
  16. Assets/Plugins/Android64.meta +8 -0
  17. Assets/Plugins/Android64/libten_vad.so.meta +2 -0
  18. Assets/Plugins/OSX.meta +8 -0
  19. Assets/Plugins/OSX/ten_vad.dylib.meta +2 -0
  20. Assets/Plugins/WebGL.meta +8 -0
  21. Assets/Plugins/WebGL/ten_vad.d.ts +111 -0
  22. Assets/Plugins/WebGL/ten_vad.d.ts.meta +7 -0
  23. Assets/Plugins/WebGL/ten_vad.js +30 -0
  24. Assets/Plugins/WebGL/ten_vad.js.meta +7 -0
  25. Assets/Plugins/WebGL/ten_vad.wasm +3 -0
  26. Assets/Plugins/WebGL/ten_vad.wasm.meta +7 -0
  27. Assets/Plugins/WebGL/webgl_microphone.jslib +370 -0
  28. Assets/Plugins/WebGL/webgl_microphone.jslib.meta +7 -0
  29. Assets/Plugins/WebGL/webgl_tenvad.jslib +326 -0
  30. Assets/Plugins/WebGL/webgl_tenvad.jslib.meta +7 -0
  31. Assets/Plugins/Windows.meta +8 -0
  32. Assets/Plugins/Windows/ten_vad.dll.meta +2 -0
  33. Assets/Plugins/Windows/ten_vad.lib.meta +2 -0
  34. Assets/Plugins/iOS.meta +8 -0
  35. Assets/Plugins/iOS/ten_vad.framework.meta +2 -0
  36. Assets/Plugins/iOS/ten_vad.framework/Headers/ten_vad.h +90 -0
  37. Assets/Plugins/iOS/ten_vad.framework/Info.plist +0 -0
  38. Assets/Plugins/iOS/ten_vad.framework/Modules/module.modulemap +5 -0
  39. Assets/Plugins/iOS/ten_vad.framework/ten_vad +3 -0
  40. Assets/Prefabs.meta +8 -0
  41. Assets/Prefabs/TextBlock.prefab +117 -0
  42. Assets/Prefabs/TextBlock.prefab.meta +7 -0
  43. Assets/Resources.meta +8 -0
  44. Assets/Resources/NanumGothic-Regular.ttf +3 -0
  45. Assets/Resources/NanumGothic-Regular.ttf.meta +21 -0
  46. Assets/Samples.meta +8 -0
  47. Assets/Samples/Sentis.meta +8 -0
  48. Assets/Samples/Sentis/2.5.0.meta +8 -0
  49. Assets/Samples/Sentis/2.5.0/Quantize a model.meta +8 -0
  50. Assets/Samples/Sentis/2.5.0/Quantize a model/Editor.meta +8 -0
.gitattributes CHANGED
@@ -22,6 +22,7 @@
22
  *.pt filter=lfs diff=lfs merge=lfs -text
23
  *.pth filter=lfs diff=lfs merge=lfs -text
24
  *.rar filter=lfs diff=lfs merge=lfs -text
 
25
  *.safetensors filter=lfs diff=lfs merge=lfs -text
26
  saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
  *.tar.* filter=lfs diff=lfs merge=lfs -text
@@ -33,3 +34,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
22
  *.pt filter=lfs diff=lfs merge=lfs -text
23
  *.pth filter=lfs diff=lfs merge=lfs -text
24
  *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.data filter=lfs diff=lfs merge=lfs -text
26
  *.safetensors filter=lfs diff=lfs merge=lfs -text
27
  saved_model/**/* filter=lfs diff=lfs merge=lfs -text
28
  *.tar.* filter=lfs diff=lfs merge=lfs -text
 
34
  *.zip filter=lfs diff=lfs merge=lfs -text
35
  *.zst filter=lfs diff=lfs merge=lfs -text
36
  *tfevents* filter=lfs diff=lfs merge=lfs -text
37
+ *.data.br filter=lfs diff=lfs merge=lfs -text
38
+ *.ttf filter=lfs diff=lfs merge=lfs -text
39
+ Assets/Plugins/iOS/ten_vad.framework/ten_vad filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # OS generated files (macOS)
2
+ .DS_Store
3
+ .DS_Store?
4
+ .AppleDouble
5
+ .LSOverride
6
+ Thumbs.db
7
+ Desktop.ini
8
+ .Trashes
9
+ .Spotlight-V100
10
+ .TemporaryItems
11
+ .fseventsd
12
+ .VolumeIcon.icns
13
+ .DS_Store?
14
+ .Icon?
15
+ ._*
16
+
17
+ # Unity generated folders
18
+ [Ll]ibrary/
19
+ [Tt]emp/
20
+ [Oo]bj/
21
+ [Bb]uild/
22
+ [Bb]uilds/
23
+ [Ll]ogs/
24
+ [Mm]emoryCaptures/
25
+ [Uu]serSettings/
26
+
27
+ # Keep the prebuilt WebGL export for Hugging Face deployment
28
+ !yolo26-unity-web/
29
+ !yolo26-unity-web/Build/
30
+ !yolo26-unity-web/Build/**
31
+ !yolo26-unity-web/TemplateData/
32
+ !yolo26-unity-web/TemplateData/**
33
+
34
+ # Unity generated files
35
+ *.csproj
36
+ *.unityproj
37
+ *.sln
38
+ *.slnx
39
+ *.suo
40
+ *.user
41
+ *.userprefs
42
+ *.userosscache
43
+ *.pdb
44
+ *.pidb
45
+ *.booproj
46
+ *.svd
47
+ *.pdb.meta
48
+ *.opendb
49
+ *.VC.db
50
+
51
+ # Unity cache / plugin related
52
+ [Dd]erivedDataCache/
53
+ *.apk
54
+ *.aab
55
+ *.unitypackage
56
+
57
+ # macOS Finder/backup artifacts
58
+ *~
59
+ *.swp
60
+ *.tmp
61
+
62
+ # IDE / editor folders
63
+ .vscode/
64
+ .vs/
65
+ .idea/
66
+
67
+ # Misc build artifacts
68
+ *.app
69
+ *.exe
70
+ *.dll
71
+ *.dylib
72
+ *.so
73
+ *.o
74
+ *.a
75
+ *.lib
76
+ *.ncb
77
+ *.idb
78
+ *.ipch
79
+ *.class
Assets/Models.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 06cd681c25d0947d1a77c7e4fbbc1218
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Models/ko-tiny.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 26ea426f2f4e04e5b8f4abc83bcee0e7
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Models/ko-tiny/decoder_model.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:48c8b18ea470d39ecc24d457ed91ab09ea05ca6d6c8f85c93e8acaf5914a7ff5
3
+ size 77932667
Assets/Models/ko-tiny/decoder_model.onnx.meta ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: b5e399f7372d64e77b3d34d6a406b100
3
+ ScriptedImporter:
4
+ internalIDToNameTable: []
5
+ externalObjects: {}
6
+ serializedVersion: 2
7
+ userData:
8
+ assetBundleName:
9
+ assetBundleVariant:
10
+ script: {fileID: 11500000, guid: f22407ba6b4157b4a93d0a670bd3dd57, type: 3}
11
+ dynamicDimConfigs:
12
+ - name: batch_size
13
+ size: -1
14
+ - name: decoder_sequence_length
15
+ size: -1
16
+ - name: encoder_sequence_length
17
+ size: -1
Assets/Models/ko-tiny/decoder_with_past_model.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2b251518314cc1d964b012375a58583fa9732774d64ba0f6dfc85f31e2470312
3
+ size 73890165
Assets/Models/ko-tiny/decoder_with_past_model.onnx.meta ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: ccbd099e987b54b8895d0c39e70afb57
3
+ ScriptedImporter:
4
+ internalIDToNameTable: []
5
+ externalObjects: {}
6
+ serializedVersion: 2
7
+ userData:
8
+ assetBundleName:
9
+ assetBundleVariant:
10
+ script: {fileID: 11500000, guid: f22407ba6b4157b4a93d0a670bd3dd57, type: 3}
11
+ dynamicDimConfigs:
12
+ - name: batch_size
13
+ size: -1
14
+ - name: past_decoder_sequence_length
15
+ size: -1
16
+ - name: encoder_sequence_length_out
17
+ size: -1
Assets/Models/ko-tiny/encoder_model.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:eca6d403468ff9a8749c1943acb0b642eea1cb3fe9f49d2c8081a1efe0ddde9d
3
+ size 30897070
Assets/Models/ko-tiny/encoder_model.onnx.meta ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 7bca79add7af74e4c99f255347806d7c
3
+ ScriptedImporter:
4
+ internalIDToNameTable: []
5
+ externalObjects: {}
6
+ serializedVersion: 2
7
+ userData:
8
+ assetBundleName:
9
+ assetBundleVariant:
10
+ script: {fileID: 11500000, guid: f22407ba6b4157b4a93d0a670bd3dd57, type: 3}
11
+ dynamicDimConfigs:
12
+ - name: batch_size
13
+ size: -1
14
+ - name: num_samples
15
+ size: -1
Assets/Plugins.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: b50d05afc006d4d508288fa1d735a35e
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Plugins/Android.meta ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 6bcb86970c7ff4e08a5499891901f8e9
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ userData:
Assets/Plugins/Android/AndroidManifest.xml ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <manifest
3
+ xmlns:android="http://schemas.android.com/apk/res/android"
4
+ xmlns:tools="http://schemas.android.com/tools">
5
+ <application>
6
+ <activity android:name="com.unity3d.player.UnityPlayerGameActivity"
7
+ android:theme="@style/BaseUnityGameActivityTheme">
8
+ <intent-filter>
9
+ <action android:name="android.intent.action.MAIN" />
10
+ <category android:name="android.intent.category.LAUNCHER" />
11
+ </intent-filter>
12
+ <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
13
+ <meta-data android:name="android.app.lib_name" android:value="game" />
14
+ </activity>
15
+ </application>
16
+
17
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="replace"/>
18
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
19
+
20
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
21
+ <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
22
+ <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:minSdkVersion="31" android:usesPermissionFlags="neverForLocation" />
23
+ <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" android:minSdkVersion="31" />
24
+ <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:minSdkVersion="31" />
25
+ <uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />
26
+ <uses-permission android:name="android.permission.VIBRATE" />
27
+
28
+ <uses-permission android:name="android.permission.INTERNET" />
29
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
30
+
31
+ </manifest>
Assets/Plugins/Android/AndroidManifest.xml.meta ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 4abd69b18c4ab45ec976851430122248
3
+ TextScriptImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
Assets/Plugins/Android/libten_vad.so.meta ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 0602dbc297778421db5501d9ec32697f
Assets/Plugins/Android64.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: be9b0a71d56184353a592c9d4ddc48c5
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Plugins/Android64/libten_vad.so.meta ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: fde5a43fd78bb48478229c97b14759e5
Assets/Plugins/OSX.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: e1609f4868189483f9228c8a07c62f75
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Plugins/OSX/ten_vad.dylib.meta ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: b4e9cf4903e1d4422892281166d16ec4
Assets/Plugins/WebGL.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 216a96c1715e468b915590406d03917b
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Plugins/WebGL/ten_vad.d.ts ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This file is part of TEN Framework, an open source project.
3
+ * Licensed under the Apache License, Version 2.0.
4
+ * See the LICENSE file for more information.
5
+ *
6
+ * TEN VAD (Voice Activity Detection) WebAssembly Module
7
+ * TypeScript type definitions
8
+ */
9
+
10
+ export interface TenVADModule {
11
+ /**
12
+ * Create and initialize a VAD instance
13
+ * @param handlePtr Pointer to store the VAD handle
14
+ * @param hopSize Number of samples between consecutive analysis frames (e.g., 256)
15
+ * @param threshold VAD detection threshold [0.0, 1.0]
16
+ * @returns 0 on success, -1 on error
17
+ */
18
+ _ten_vad_create(handlePtr: number, hopSize: number, threshold: number): number;
19
+
20
+ /**
21
+ * Process audio frame for voice activity detection
22
+ * @param handle Valid VAD handle from ten_vad_create
23
+ * @param audioDataPtr Pointer to int16 audio samples array
24
+ * @param audioDataLength Length of audio data (should equal hopSize)
25
+ * @param outProbabilityPtr Pointer to output probability [0.0, 1.0]
26
+ * @param outFlagPtr Pointer to output flag (0: no voice, 1: voice detected)
27
+ * @returns 0 on success, -1 on error
28
+ */
29
+ _ten_vad_process(
30
+ handle: number,
31
+ audioDataPtr: number,
32
+ audioDataLength: number,
33
+ outProbabilityPtr: number,
34
+ outFlagPtr: number
35
+ ): number;
36
+
37
+ /**
38
+ * Destroy VAD instance and release resources
39
+ * @param handlePtr Pointer to the VAD handle
40
+ * @returns 0 on success, -1 on error
41
+ */
42
+ _ten_vad_destroy(handlePtr: number): number;
43
+
44
+ /**
45
+ * Get library version string
46
+ * @returns Version string pointer
47
+ */
48
+ _ten_vad_get_version(): number;
49
+
50
+ // WebAssembly Memory Management
51
+ _malloc(size: number): number;
52
+ _free(ptr: number): void;
53
+
54
+ // Memory access helpers
55
+ HEAP16: Int16Array;
56
+ HEAPF32: Float32Array;
57
+ HEAP32: Int32Array;
58
+ HEAPU8: Uint8Array;
59
+
60
+ // Value access methods
61
+ getValue(ptr: number, type: 'i8' | 'i16' | 'i32' | 'float' | 'double'): number;
62
+ setValue(ptr: number, value: number, type: 'i8' | 'i16' | 'i32' | 'float' | 'double'): void;
63
+
64
+ // String utilities
65
+ UTF8ToString(ptr: number): string;
66
+ lengthBytesUTF8(str: string): number;
67
+ stringToUTF8(str: string, outPtr: number, maxBytesToWrite: number): void;
68
+ }
69
+
70
+ /**
71
+ * High-level TypeScript wrapper for TEN VAD
72
+ */
73
+ export class TenVAD {
74
+ private module: TenVADModule;
75
+ private handle: number | null;
76
+ private hopSize: number;
77
+
78
+ constructor(module: TenVADModule, hopSize: number, threshold: number);
79
+
80
+ /**
81
+ * Process audio samples for voice activity detection
82
+ * @param audioData Int16Array of audio samples (length must equal hopSize)
83
+ * @returns Object with probability and voice detection flag
84
+ */
85
+ process(audioData: Int16Array): {
86
+ probability: number;
87
+ isVoice: boolean;
88
+ } | null;
89
+
90
+ /**
91
+ * Get library version
92
+ */
93
+ getVersion(): string;
94
+
95
+ /**
96
+ * Destroy VAD instance
97
+ */
98
+ destroy(): void;
99
+
100
+ /**
101
+ * Check if VAD instance is valid
102
+ */
103
+ isValid(): boolean;
104
+ }
105
+
106
+ /**
107
+ * Create TEN VAD WebAssembly module
108
+ */
109
+ declare function createVADModule(): Promise<TenVADModule>;
110
+
111
+ export default createVADModule;
Assets/Plugins/WebGL/ten_vad.d.ts.meta ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 3bcf5684cac5a41a68ba877188826aa3
3
+ DefaultImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
Assets/Plugins/WebGL/ten_vad.js ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ var createVADModule = (() => {
3
+ var _scriptDir = import.meta.url;
4
+
5
+ return (
6
+ function(createVADModule) {
7
+ createVADModule = createVADModule || {};
8
+
9
+
10
+ var a;a||(a=typeof createVADModule !== 'undefined' ? createVADModule : {});var k,l;a.ready=new Promise(function(b,c){k=b;l=c});var p=Object.assign({},a),r="object"==typeof window,u="function"==typeof importScripts,v="",w;
11
+ if(r||u)u?v=self.location.href:"undefined"!=typeof document&&document.currentScript&&(v=document.currentScript.src),_scriptDir&&(v=_scriptDir),0!==v.indexOf("blob:")?v=v.substr(0,v.replace(/[?#].*/,"").lastIndexOf("/")+1):v="",u&&(w=b=>{var c=new XMLHttpRequest;c.open("GET",b,!1);c.responseType="arraybuffer";c.send(null);return new Uint8Array(c.response)});var aa=a.print||console.log.bind(console),x=a.printErr||console.warn.bind(console);Object.assign(a,p);p=null;var y;a.wasmBinary&&(y=a.wasmBinary);
12
+ var noExitRuntime=a.noExitRuntime||!0;"object"!=typeof WebAssembly&&z("no native wasm support detected");var A,B=!1,C="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0,D,E,F;function J(){var b=A.buffer;D=b;a.HEAP8=new Int8Array(b);a.HEAP16=new Int16Array(b);a.HEAP32=new Int32Array(b);a.HEAPU8=E=new Uint8Array(b);a.HEAPU16=new Uint16Array(b);a.HEAPU32=F=new Uint32Array(b);a.HEAPF32=new Float32Array(b);a.HEAPF64=new Float64Array(b)}var K=[],L=[],M=[];
13
+ function ba(){var b=a.preRun.shift();K.unshift(b)}var N=0,O=null,P=null;function z(b){if(a.onAbort)a.onAbort(b);b="Aborted("+b+")";x(b);B=!0;b=new WebAssembly.RuntimeError(b+". Build with -sASSERTIONS for more info.");l(b);throw b;}function Q(){return R.startsWith("data:application/octet-stream;base64,")}var R;if(a.locateFile){if(R="ten_vad.wasm",!Q()){var S=R;R=a.locateFile?a.locateFile(S,v):v+S}}else R=(new URL("ten_vad.wasm",import.meta.url)).href;
14
+ function T(){var b=R;try{if(b==R&&y)return new Uint8Array(y);if(w)return w(b);throw"both async and sync fetching of the wasm failed";}catch(c){z(c)}}function ca(){return y||!r&&!u||"function"!=typeof fetch?Promise.resolve().then(function(){return T()}):fetch(R,{credentials:"same-origin"}).then(function(b){if(!b.ok)throw"failed to load wasm binary file at '"+R+"'";return b.arrayBuffer()}).catch(function(){return T()})}function U(b){for(;0<b.length;)b.shift()(a)}
15
+ var da=[null,[],[]],ea={a:function(){z("")},f:function(b,c,m){E.copyWithin(b,c,c+m)},c:function(b){var c=E.length;b>>>=0;if(2147483648<b)return!1;for(var m=1;4>=m;m*=2){var h=c*(1+.2/m);h=Math.min(h,b+100663296);var d=Math;h=Math.max(b,h);d=d.min.call(d,2147483648,h+(65536-h%65536)%65536);a:{try{A.grow(d-D.byteLength+65535>>>16);J();var e=1;break a}catch(W){}e=void 0}if(e)return!0}return!1},e:function(){return 52},b:function(){return 70},d:function(b,c,m,h){for(var d=0,e=0;e<m;e++){var W=F[c>>2],
16
+ X=F[c+4>>2];c+=8;for(var G=0;G<X;G++){var f=E[W+G],H=da[b];if(0===f||10===f){f=H;for(var n=0,q=n+NaN,t=n;f[t]&&!(t>=q);)++t;if(16<t-n&&f.buffer&&C)f=C.decode(f.subarray(n,t));else{for(q="";n<t;){var g=f[n++];if(g&128){var I=f[n++]&63;if(192==(g&224))q+=String.fromCharCode((g&31)<<6|I);else{var Y=f[n++]&63;g=224==(g&240)?(g&15)<<12|I<<6|Y:(g&7)<<18|I<<12|Y<<6|f[n++]&63;65536>g?q+=String.fromCharCode(g):(g-=65536,q+=String.fromCharCode(55296|g>>10,56320|g&1023))}}else q+=String.fromCharCode(g)}f=q}(1===
17
+ b?aa:x)(f);H.length=0}else H.push(f)}d+=X}F[h>>2]=d;return 0}};
18
+ (function(){function b(d){a.asm=d.exports;A=a.asm.g;J();L.unshift(a.asm.h);N--;a.monitorRunDependencies&&a.monitorRunDependencies(N);0==N&&(null!==O&&(clearInterval(O),O=null),P&&(d=P,P=null,d()))}function c(d){b(d.instance)}function m(d){return ca().then(function(e){return WebAssembly.instantiate(e,h)}).then(function(e){return e}).then(d,function(e){x("failed to asynchronously prepare wasm: "+e);z(e)})}var h={a:ea};N++;a.monitorRunDependencies&&a.monitorRunDependencies(N);if(a.instantiateWasm)try{return a.instantiateWasm(h,
19
+ b)}catch(d){x("Module.instantiateWasm callback failed with error: "+d),l(d)}(function(){return y||"function"!=typeof WebAssembly.instantiateStreaming||Q()||"function"!=typeof fetch?m(c):fetch(R,{credentials:"same-origin"}).then(function(d){return WebAssembly.instantiateStreaming(d,h).then(c,function(e){x("wasm streaming compile failed: "+e);x("falling back to ArrayBuffer instantiation");return m(c)})})})().catch(l);return{}})();
20
+ a.___wasm_call_ctors=function(){return(a.___wasm_call_ctors=a.asm.h).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.i).apply(null,arguments)};a._free=function(){return(a._free=a.asm.j).apply(null,arguments)};a._ten_vad_create=function(){return(a._ten_vad_create=a.asm.k).apply(null,arguments)};a._ten_vad_process=function(){return(a._ten_vad_process=a.asm.l).apply(null,arguments)};a._ten_vad_destroy=function(){return(a._ten_vad_destroy=a.asm.m).apply(null,arguments)};
21
+ a._ten_vad_get_version=function(){return(a._ten_vad_get_version=a.asm.n).apply(null,arguments)};var V;P=function fa(){V||Z();V||(P=fa)};
22
+ function Z(){function b(){if(!V&&(V=!0,a.calledRun=!0,!B)){U(L);k(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;){var c=a.postRun.shift();M.unshift(c)}U(M)}}if(!(0<N)){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)ba();U(K);0<N||(a.setStatus?(a.setStatus("Running..."),setTimeout(function(){setTimeout(function(){a.setStatus("")},1);b()},1)):b())}}
23
+ if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0<a.preInit.length;)a.preInit.pop()();Z();
24
+
25
+
26
+ return createVADModule.ready
27
+ }
28
+ );
29
+ })();
30
+ export default createVADModule;
Assets/Plugins/WebGL/ten_vad.js.meta ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 906b68ef586c94324870466ec3bf4d17
3
+ DefaultImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
Assets/Plugins/WebGL/ten_vad.wasm ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1ec0b9640683987e15a4e54e4ce5642b2447c6e5d82b1be889b5099c75434fc3
3
+ size 283349
Assets/Plugins/WebGL/ten_vad.wasm.meta ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 6cf6d225be985413e86c4c01fbd03d19
3
+ DefaultImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
Assets/Plugins/WebGL/webgl_microphone.jslib ADDED
@@ -0,0 +1,370 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ mergeInto(LibraryManager.library, {
2
+ $WebGLMicrophone: {
3
+ context: null,
4
+ stream: null,
5
+ sourceNode: null,
6
+ processorNode: null,
7
+ workletNode: null,
8
+ outputNode: null,
9
+ workletModuleLoaded: false,
10
+ workletWarningLogged: false,
11
+ constraintsWarningLogged: false,
12
+ isStarting: false,
13
+ targetSampleRate: 16000,
14
+ sourceSampleRate: 16000,
15
+ queue: null,
16
+ queueCapacity: 0,
17
+ queueHead: 0,
18
+ queueTail: 0,
19
+ queueCount: 0,
20
+ started: false,
21
+
22
+ ensureQueue: function() {
23
+ var mic = WebGLMicrophone;
24
+ var requiredCapacity = Math.max(mic.targetSampleRate * 20, 4096);
25
+ if (mic.queueCapacity === requiredCapacity && mic.queue !== null) {
26
+ return;
27
+ }
28
+
29
+ mic.queue = new Float32Array(requiredCapacity);
30
+ mic.queueCapacity = requiredCapacity;
31
+ mic.queueHead = 0;
32
+ mic.queueTail = 0;
33
+ mic.queueCount = 0;
34
+ },
35
+
36
+ clearQueue: function() {
37
+ var mic = WebGLMicrophone;
38
+ mic.queueHead = 0;
39
+ mic.queueTail = 0;
40
+ mic.queueCount = 0;
41
+ },
42
+
43
+ pushSample: function(sample) {
44
+ var mic = WebGLMicrophone;
45
+ if (!mic.queue) {
46
+ return;
47
+ }
48
+
49
+ mic.queue[mic.queueTail] = sample;
50
+ mic.queueTail = (mic.queueTail + 1) % mic.queueCapacity;
51
+
52
+ if (mic.queueCount < mic.queueCapacity) {
53
+ mic.queueCount++;
54
+ } else {
55
+ mic.queueHead = (mic.queueHead + 1) % mic.queueCapacity;
56
+ }
57
+ },
58
+
59
+ pushFloatBuffer: function(inputBuffer) {
60
+ var mic = WebGLMicrophone;
61
+ if (!mic.queue || !inputBuffer || !inputBuffer.length) {
62
+ return;
63
+ }
64
+
65
+ var ratio = mic.sourceSampleRate / mic.targetSampleRate;
66
+ if (!isFinite(ratio) || ratio <= 0) {
67
+ ratio = 1;
68
+ }
69
+
70
+ var outputLength = Math.floor((inputBuffer.length - 1) / ratio);
71
+ if (outputLength <= 0) {
72
+ return;
73
+ }
74
+
75
+ for (var i = 0; i < outputLength; i++) {
76
+ var sourceIndex = i * ratio;
77
+ var leftIndex = sourceIndex | 0;
78
+ var rightIndex = leftIndex + 1;
79
+ if (rightIndex >= inputBuffer.length) {
80
+ rightIndex = inputBuffer.length - 1;
81
+ }
82
+
83
+ var leftValue = inputBuffer[leftIndex];
84
+ var rightValue = inputBuffer[rightIndex];
85
+ var t = sourceIndex - leftIndex;
86
+ var sample = leftValue + (rightValue - leftValue) * t;
87
+
88
+ WebGLMicrophone.pushSample(sample);
89
+ }
90
+ },
91
+
92
+ setupScriptProcessorNode: function() {
93
+ var mic = WebGLMicrophone;
94
+ try {
95
+ mic.processorNode = mic.context.createScriptProcessor(4096, 1, 1);
96
+ mic.processorNode.onaudioprocess = function(evt) {
97
+ var buffer = evt.inputBuffer.getChannelData(0);
98
+ if (buffer && buffer.length) {
99
+ WebGLMicrophone.pushFloatBuffer(buffer);
100
+ }
101
+ };
102
+
103
+ mic.sourceNode.connect(mic.processorNode);
104
+ mic.processorNode.connect(mic.outputNode);
105
+ return true;
106
+ } catch (err) {
107
+ console.warn("[WebGLMic] Failed to initialize ScriptProcessorNode:", err);
108
+ return false;
109
+ }
110
+ },
111
+
112
+ createAudioWorkletNode: function() {
113
+ var mic = WebGLMicrophone;
114
+ try {
115
+ mic.workletNode = new AudioWorkletNode(mic.context, "unity-mic-capture", {
116
+ numberOfInputs: 1,
117
+ numberOfOutputs: 1,
118
+ channelCount: 1,
119
+ channelCountMode: "explicit",
120
+ channelInterpretation: "speakers"
121
+ });
122
+
123
+ mic.workletNode.port.onmessage = function(evt) {
124
+ var buffer = evt.data;
125
+ if (buffer && buffer.length) {
126
+ WebGLMicrophone.pushFloatBuffer(buffer);
127
+ }
128
+ };
129
+
130
+ mic.sourceNode.connect(mic.workletNode);
131
+ mic.workletNode.connect(mic.outputNode);
132
+ return true;
133
+ } catch (err) {
134
+ if (!mic.workletWarningLogged) {
135
+ mic.workletWarningLogged = true;
136
+ console.warn("[WebGLMic] AudioWorklet unavailable, falling back to ScriptProcessorNode:", err);
137
+ }
138
+ mic.workletNode = null;
139
+ return false;
140
+ }
141
+ },
142
+
143
+ getAudioWorkletModuleUrl: function() {
144
+ var basePath = "StreamingAssets";
145
+ if (typeof Module !== "undefined" && Module.streamingAssetsUrl) {
146
+ basePath = Module.streamingAssetsUrl;
147
+ }
148
+
149
+ if (basePath.length > 0 && basePath.charAt(basePath.length - 1) === "/") {
150
+ basePath = basePath.substring(0, basePath.length - 1);
151
+ }
152
+
153
+ return basePath + "/unity-mic-capture-worklet.js";
154
+ },
155
+
156
+ trySetupAudioWorkletNode: function() {
157
+ var mic = WebGLMicrophone;
158
+ if (!mic.context ||
159
+ !mic.context.audioWorklet ||
160
+ typeof AudioWorkletNode === "undefined" ||
161
+ typeof Promise === "undefined") {
162
+ return Promise.resolve(false);
163
+ }
164
+
165
+ if (mic.workletModuleLoaded) {
166
+ return Promise.resolve(WebGLMicrophone.createAudioWorkletNode());
167
+ }
168
+
169
+ var moduleUrl = WebGLMicrophone.getAudioWorkletModuleUrl();
170
+
171
+ return mic.context.audioWorklet.addModule(moduleUrl)
172
+ .then(function() {
173
+ mic.workletModuleLoaded = true;
174
+ return WebGLMicrophone.createAudioWorkletNode();
175
+ })
176
+ ["catch"](function(err) {
177
+ if (!mic.workletWarningLogged) {
178
+ mic.workletWarningLogged = true;
179
+ console.warn("[WebGLMic] Failed to load AudioWorklet module. Falling back to ScriptProcessorNode:", err);
180
+ }
181
+ return false;
182
+ });
183
+ },
184
+
185
+ start: function(sampleRate) {
186
+ var mic = WebGLMicrophone;
187
+
188
+ if (mic.started || mic.isStarting) {
189
+ return 1;
190
+ }
191
+
192
+ if (typeof navigator === "undefined" ||
193
+ !navigator.mediaDevices ||
194
+ !navigator.mediaDevices.getUserMedia) {
195
+ return 0;
196
+ }
197
+
198
+ var AudioContextClass = null;
199
+ if (typeof window !== "undefined") {
200
+ AudioContextClass = window.AudioContext || window.webkitAudioContext;
201
+ }
202
+ if (!AudioContextClass) {
203
+ return 0;
204
+ }
205
+
206
+ mic.isStarting = true;
207
+ mic.targetSampleRate = sampleRate > 0 ? sampleRate : 16000;
208
+ WebGLMicrophone.ensureQueue();
209
+ WebGLMicrophone.clearQueue();
210
+
211
+ if (!mic.context || mic.context.state === "closed") {
212
+ mic.context = new AudioContextClass();
213
+ mic.workletModuleLoaded = false;
214
+ }
215
+
216
+ if (mic.context.state === "suspended") {
217
+ mic.context.resume()["catch"](function() {});
218
+ }
219
+
220
+ var requestedAudioConstraints = {
221
+ channelCount: 1,
222
+ echoCancellation: false,
223
+ noiseSuppression: false,
224
+ autoGainControl: false
225
+ };
226
+
227
+ if (mic.targetSampleRate > 0) {
228
+ requestedAudioConstraints.sampleRate = mic.targetSampleRate;
229
+ }
230
+
231
+ navigator.mediaDevices.getUserMedia({ audio: requestedAudioConstraints, video: false })
232
+ ["catch"](function(err) {
233
+ if (!mic.constraintsWarningLogged) {
234
+ mic.constraintsWarningLogged = true;
235
+ console.warn("[WebGLMic] Preferred getUserMedia constraints failed. Retrying with browser defaults:", err);
236
+ }
237
+ return navigator.mediaDevices.getUserMedia({ audio: true, video: false });
238
+ })
239
+ .then(function(stream) {
240
+ if (!mic.context) {
241
+ WebGLMicrophone.stop();
242
+ return;
243
+ }
244
+
245
+ mic.stream = stream;
246
+ mic.sourceSampleRate = mic.context.sampleRate;
247
+
248
+ try {
249
+ mic.sourceNode = mic.context.createMediaStreamSource(stream);
250
+ mic.outputNode = mic.context.createGain();
251
+ mic.outputNode.gain.value = 0;
252
+
253
+ WebGLMicrophone.trySetupAudioWorkletNode()
254
+ .then(function(workletReady) {
255
+ if (!workletReady) {
256
+ var scriptReady = WebGLMicrophone.setupScriptProcessorNode();
257
+ if (!scriptReady) {
258
+ WebGLMicrophone.stop();
259
+ console.warn("[WebGLMic] Failed to initialize any audio processor node.");
260
+ return;
261
+ }
262
+ }
263
+
264
+ mic.outputNode.connect(mic.context.destination);
265
+ mic.started = true;
266
+ mic.isStarting = false;
267
+ })
268
+ ["catch"](function(err) {
269
+ WebGLMicrophone.stop();
270
+ console.warn("[WebGLMic] Failed to initialize processor:", err);
271
+ });
272
+ } catch (err) {
273
+ WebGLMicrophone.stop();
274
+ console.warn("[WebGLMic] Failed to initialize processor:", err);
275
+ }
276
+ })
277
+ ["catch"](function(err) {
278
+ mic.started = false;
279
+ mic.isStarting = false;
280
+ console.warn("[WebGLMic] getUserMedia failed:", err);
281
+ });
282
+
283
+ return 1;
284
+ },
285
+
286
+ stop: function() {
287
+ var mic = WebGLMicrophone;
288
+
289
+ if (mic.workletNode) {
290
+ mic.workletNode.port.onmessage = null;
291
+ mic.workletNode.disconnect();
292
+ mic.workletNode = null;
293
+ }
294
+
295
+ if (mic.processorNode) {
296
+ mic.processorNode.onaudioprocess = null;
297
+ mic.processorNode.disconnect();
298
+ mic.processorNode = null;
299
+ }
300
+
301
+ if (mic.outputNode) {
302
+ mic.outputNode.disconnect();
303
+ mic.outputNode = null;
304
+ }
305
+
306
+ if (mic.sourceNode) {
307
+ mic.sourceNode.disconnect();
308
+ mic.sourceNode = null;
309
+ }
310
+
311
+ if (mic.stream) {
312
+ var tracks = mic.stream.getTracks();
313
+ for (var i = 0; i < tracks.length; i++) {
314
+ tracks[i].stop();
315
+ }
316
+ mic.stream = null;
317
+ }
318
+
319
+ if (mic.context && mic.context.state !== "closed") {
320
+ mic.context.suspend()["catch"](function() {});
321
+ }
322
+
323
+ mic.isStarting = false;
324
+ mic.started = false;
325
+ WebGLMicrophone.clearQueue();
326
+ },
327
+
328
+ readSamples: function(bufferPtr, maxSamples) {
329
+ var mic = WebGLMicrophone;
330
+ if (!mic.queue || maxSamples <= 0 || !bufferPtr) {
331
+ return 0;
332
+ }
333
+
334
+ var readCount = Math.min(maxSamples, mic.queueCount);
335
+ var outBuffer = HEAPF32.subarray(bufferPtr >> 2, (bufferPtr >> 2) + readCount);
336
+ for (var i = 0; i < readCount; i++) {
337
+ outBuffer[i] = mic.queue[mic.queueHead];
338
+ mic.queueHead = (mic.queueHead + 1) % mic.queueCapacity;
339
+ }
340
+
341
+ mic.queueCount -= readCount;
342
+ return readCount;
343
+ },
344
+
345
+ isRecording: function() {
346
+ var mic = WebGLMicrophone;
347
+ return (mic.started || mic.isStarting) ? 1 : 0;
348
+ }
349
+ },
350
+
351
+ WebGLMic_Start__deps: ["$WebGLMicrophone"],
352
+ WebGLMic_Start: function(sampleRate) {
353
+ return WebGLMicrophone.start(sampleRate);
354
+ },
355
+
356
+ WebGLMic_Stop__deps: ["$WebGLMicrophone"],
357
+ WebGLMic_Stop: function() {
358
+ WebGLMicrophone.stop();
359
+ },
360
+
361
+ WebGLMic_GetSamples__deps: ["$WebGLMicrophone"],
362
+ WebGLMic_GetSamples: function(bufferPtr, maxSamples) {
363
+ return WebGLMicrophone.readSamples(bufferPtr, maxSamples);
364
+ },
365
+
366
+ WebGLMic_IsRecording__deps: ["$WebGLMicrophone"],
367
+ WebGLMic_IsRecording: function() {
368
+ return WebGLMicrophone.isRecording();
369
+ }
370
+ });
Assets/Plugins/WebGL/webgl_microphone.jslib.meta ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 4f5c5bd5f0fce4f5f8b7a6a1d89b0f2c
3
+ DefaultImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
Assets/Plugins/WebGL/webgl_tenvad.jslib ADDED
@@ -0,0 +1,326 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ mergeInto(LibraryManager.library, {
2
+ $WebGLTenVad: {
3
+ module: null,
4
+ modulePromise: null,
5
+ handles: null,
6
+ nextInstanceId: 1,
7
+ ready: false,
8
+ loading: false,
9
+ failed: false,
10
+ lastError: "",
11
+
12
+ ensureHandles: function() {
13
+ if (!WebGLTenVad.handles) {
14
+ WebGLTenVad.handles = {};
15
+ }
16
+ },
17
+
18
+ getStreamingAssetsBaseUrl: function() {
19
+ var basePath = "StreamingAssets";
20
+
21
+ if (typeof Module !== "undefined") {
22
+ if (Module.streamingAssetsUrl) {
23
+ basePath = Module.streamingAssetsUrl;
24
+ } else if (Module.absoluteStreamingAssetsUrl) {
25
+ basePath = Module.absoluteStreamingAssetsUrl;
26
+ }
27
+ }
28
+
29
+ if (basePath.length > 0 && basePath.charAt(basePath.length - 1) === "/") {
30
+ basePath = basePath.substring(0, basePath.length - 1);
31
+ }
32
+
33
+ return basePath;
34
+ },
35
+
36
+ buildStreamingAssetUrl: function(fileName) {
37
+ var combinedPath = WebGLTenVad.getStreamingAssetsBaseUrl() + "/" + fileName;
38
+
39
+ if (typeof URL !== "undefined" && typeof document !== "undefined" && document.baseURI) {
40
+ try {
41
+ return new URL(combinedPath, document.baseURI).toString();
42
+ } catch (err) {
43
+ // Fallback to plain path below.
44
+ }
45
+ }
46
+
47
+ return combinedPath;
48
+ },
49
+
50
+ ensureModuleLoading: function() {
51
+ var vad = WebGLTenVad;
52
+ if (vad.ready && vad.module) {
53
+ return Promise.resolve(vad.module);
54
+ }
55
+
56
+ if (vad.modulePromise) {
57
+ return vad.modulePromise;
58
+ }
59
+
60
+ var moduleUrl = WebGLTenVad.buildStreamingAssetUrl("ten_vad.js");
61
+ var wasmUrl = WebGLTenVad.buildStreamingAssetUrl("ten_vad.wasm");
62
+
63
+ vad.loading = true;
64
+ vad.failed = false;
65
+ vad.lastError = "";
66
+
67
+ vad.modulePromise = import(moduleUrl)
68
+ .then(function(namespace) {
69
+ var createFactory = null;
70
+ if (namespace) {
71
+ if (typeof namespace.default === "function") {
72
+ createFactory = namespace.default;
73
+ } else if (typeof namespace.createVADModule === "function") {
74
+ createFactory = namespace.createVADModule;
75
+ }
76
+ }
77
+
78
+ if (!createFactory) {
79
+ throw new Error("ten_vad.js does not export a VAD module factory.");
80
+ }
81
+
82
+ return createFactory({
83
+ locateFile: function(path) {
84
+ if (path === "ten_vad.wasm") {
85
+ return wasmUrl;
86
+ }
87
+
88
+ var slashIndex = wasmUrl.lastIndexOf("/");
89
+ if (slashIndex >= 0) {
90
+ return wasmUrl.substring(0, slashIndex + 1) + path;
91
+ }
92
+
93
+ return path;
94
+ }
95
+ });
96
+ })
97
+ .then(function(moduleInstance) {
98
+ if (!moduleInstance || typeof moduleInstance._ten_vad_create !== "function") {
99
+ throw new Error("Loaded module is missing ten_vad exports.");
100
+ }
101
+
102
+ vad.module = moduleInstance;
103
+ vad.ready = true;
104
+ vad.loading = false;
105
+ vad.failed = false;
106
+ console.log("[WebGLTenVad] ten_vad module loaded.");
107
+ return moduleInstance;
108
+ })
109
+ ["catch"](function(err) {
110
+ vad.module = null;
111
+ vad.ready = false;
112
+ vad.loading = false;
113
+ vad.failed = true;
114
+ vad.lastError = err && err.message ? err.message : String(err);
115
+ console.warn("[WebGLTenVad] Failed to load ten_vad module:", err);
116
+ return null;
117
+ });
118
+
119
+ return vad.modulePromise;
120
+ },
121
+
122
+ createInstance: function(hopSize, threshold) {
123
+ var vad = WebGLTenVad;
124
+ if (!vad.ready || !vad.module) {
125
+ if (vad.failed) {
126
+ return -1;
127
+ }
128
+
129
+ WebGLTenVad.ensureModuleLoading();
130
+ return -2;
131
+ }
132
+
133
+ var moduleInstance = vad.module;
134
+ var handlePtr = moduleInstance._malloc(4);
135
+ if (!handlePtr) {
136
+ vad.lastError = "Failed to allocate handle pointer.";
137
+ return -1;
138
+ }
139
+
140
+ try {
141
+ var result = moduleInstance._ten_vad_create(handlePtr, hopSize, threshold);
142
+ if (result !== 0) {
143
+ vad.lastError = "ten_vad_create failed: " + result;
144
+ return -1;
145
+ }
146
+
147
+ var nativeHandle = moduleInstance.HEAP32[handlePtr >> 2];
148
+ if (!nativeHandle) {
149
+ vad.lastError = "ten_vad_create returned an invalid handle.";
150
+ return -1;
151
+ }
152
+
153
+ WebGLTenVad.ensureHandles();
154
+ var instanceId = vad.nextInstanceId++;
155
+ vad.handles[instanceId] = {
156
+ nativeHandle: nativeHandle,
157
+ inputPtr: 0,
158
+ inputCapacity: 0,
159
+ probPtr: 0,
160
+ flagPtr: 0
161
+ };
162
+ return instanceId;
163
+ } catch (err) {
164
+ vad.lastError = err && err.message ? err.message : String(err);
165
+ console.warn("[WebGLTenVad] createInstance failed:", err);
166
+ return -1;
167
+ } finally {
168
+ moduleInstance._free(handlePtr);
169
+ }
170
+ },
171
+
172
+ process: function(instanceId, audioPtr, audioLength, outProbabilityPtr, outFlagPtr) {
173
+ var vad = WebGLTenVad;
174
+ if (!vad.ready || !vad.module) {
175
+ if (vad.failed) {
176
+ return -1;
177
+ }
178
+
179
+ WebGLTenVad.ensureModuleLoading();
180
+ return -2;
181
+ }
182
+
183
+ WebGLTenVad.ensureHandles();
184
+ var instance = vad.handles[instanceId];
185
+ if (!instance || !instance.nativeHandle) {
186
+ vad.lastError = "Invalid instance id: " + instanceId;
187
+ return -1;
188
+ }
189
+
190
+ if (!audioPtr || audioLength <= 0 || !outProbabilityPtr || !outFlagPtr) {
191
+ vad.lastError = "Invalid process arguments.";
192
+ return -1;
193
+ }
194
+
195
+ var moduleInstance = vad.module;
196
+
197
+ try {
198
+ if (!instance.inputPtr || instance.inputCapacity < audioLength) {
199
+ if (instance.inputPtr) {
200
+ moduleInstance._free(instance.inputPtr);
201
+ }
202
+
203
+ instance.inputPtr = moduleInstance._malloc(audioLength * 2);
204
+ instance.inputCapacity = instance.inputPtr ? audioLength : 0;
205
+ if (!instance.inputPtr) {
206
+ vad.lastError = "Failed to allocate process input buffer.";
207
+ return -1;
208
+ }
209
+ }
210
+
211
+ if (!instance.probPtr) {
212
+ instance.probPtr = moduleInstance._malloc(4);
213
+ if (!instance.probPtr) {
214
+ vad.lastError = "Failed to allocate process probability buffer.";
215
+ return -1;
216
+ }
217
+ }
218
+
219
+ if (!instance.flagPtr) {
220
+ instance.flagPtr = moduleInstance._malloc(4);
221
+ if (!instance.flagPtr) {
222
+ vad.lastError = "Failed to allocate process flag buffer.";
223
+ return -1;
224
+ }
225
+ }
226
+
227
+ var sourceData = HEAP16.subarray(audioPtr >> 1, (audioPtr >> 1) + audioLength);
228
+ moduleInstance.HEAP16.set(sourceData, instance.inputPtr >> 1);
229
+
230
+ var result = moduleInstance._ten_vad_process(instance.nativeHandle, instance.inputPtr, audioLength, instance.probPtr, instance.flagPtr);
231
+ if (result !== 0) {
232
+ vad.lastError = "ten_vad_process failed: " + result;
233
+ return result;
234
+ }
235
+
236
+ HEAPF32[outProbabilityPtr >> 2] = moduleInstance.HEAPF32[instance.probPtr >> 2];
237
+ HEAP32[outFlagPtr >> 2] = moduleInstance.HEAP32[instance.flagPtr >> 2];
238
+ return 0;
239
+ } catch (err) {
240
+ vad.lastError = err && err.message ? err.message : String(err);
241
+ console.warn("[WebGLTenVad] process failed:", err);
242
+ return -1;
243
+ }
244
+ },
245
+
246
+ destroyInstance: function(instanceId) {
247
+ var vad = WebGLTenVad;
248
+ WebGLTenVad.ensureHandles();
249
+
250
+ var instance = vad.handles[instanceId];
251
+ if (!instance || !instance.nativeHandle) {
252
+ return 0;
253
+ }
254
+
255
+ delete vad.handles[instanceId];
256
+
257
+ if (!vad.ready || !vad.module) {
258
+ return 0;
259
+ }
260
+
261
+ var moduleInstance = vad.module;
262
+ var handlePtr = moduleInstance._malloc(4);
263
+ if (!handlePtr) {
264
+ return -1;
265
+ }
266
+
267
+ try {
268
+ if (instance.inputPtr) {
269
+ moduleInstance._free(instance.inputPtr);
270
+ instance.inputPtr = 0;
271
+ }
272
+ if (instance.probPtr) {
273
+ moduleInstance._free(instance.probPtr);
274
+ instance.probPtr = 0;
275
+ }
276
+ if (instance.flagPtr) {
277
+ moduleInstance._free(instance.flagPtr);
278
+ instance.flagPtr = 0;
279
+ }
280
+
281
+ moduleInstance.HEAP32[handlePtr >> 2] = instance.nativeHandle;
282
+ return moduleInstance._ten_vad_destroy(handlePtr);
283
+ } catch (err) {
284
+ console.warn("[WebGLTenVad] destroyInstance failed:", err);
285
+ return -1;
286
+ } finally {
287
+ moduleInstance._free(handlePtr);
288
+ }
289
+ },
290
+
291
+ getState: function() {
292
+ var vad = WebGLTenVad;
293
+ if (vad.ready && vad.module) {
294
+ return 1;
295
+ }
296
+ if (vad.failed) {
297
+ return -1;
298
+ }
299
+ if (vad.loading || vad.modulePromise) {
300
+ return 0;
301
+ }
302
+
303
+ return 0;
304
+ }
305
+ },
306
+
307
+ WebGLTenVad_Create__deps: ["$WebGLTenVad"],
308
+ WebGLTenVad_Create: function(hopSize, threshold) {
309
+ return WebGLTenVad.createInstance(hopSize, threshold);
310
+ },
311
+
312
+ WebGLTenVad_Process__deps: ["$WebGLTenVad"],
313
+ WebGLTenVad_Process: function(instanceId, audioPtr, audioLength, outProbabilityPtr, outFlagPtr) {
314
+ return WebGLTenVad.process(instanceId, audioPtr, audioLength, outProbabilityPtr, outFlagPtr);
315
+ },
316
+
317
+ WebGLTenVad_Destroy__deps: ["$WebGLTenVad"],
318
+ WebGLTenVad_Destroy: function(instanceId) {
319
+ return WebGLTenVad.destroyInstance(instanceId);
320
+ },
321
+
322
+ WebGLTenVad_GetState__deps: ["$WebGLTenVad"],
323
+ WebGLTenVad_GetState: function() {
324
+ return WebGLTenVad.getState();
325
+ }
326
+ });
Assets/Plugins/WebGL/webgl_tenvad.jslib.meta ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: d2f37d95eb5f4f78b1f52f70851b3b17
3
+ DefaultImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
Assets/Plugins/Windows.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: ce027e64bc90847c58210b51036fff29
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Plugins/Windows/ten_vad.dll.meta ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: e118f8e47413c47618e2ca4d19886e07
Assets/Plugins/Windows/ten_vad.lib.meta ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: c11568151fdf14b58927f0450dae0109
Assets/Plugins/iOS.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 09f90e50536ce4a0c9483615cfc472de
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Plugins/iOS/ten_vad.framework.meta ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 2effc7f3b316f46088fed03223cc42b9
Assets/Plugins/iOS/ten_vad.framework/Headers/ten_vad.h ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * @file ten_vad.h
3
+ * @brief Ten Voice Activity Detection (ten_vad) C API
4
+ * Version: 1.0.0
5
+ *
6
+ * Provides functions to create, process, and destroy a VAD instance.
7
+ */
8
+ #ifndef TEN_VAD_H
9
+ #define TEN_VAD_H
10
+
11
+ #if defined(__APPLE__) || defined(__ANDROID__) || defined(__linux__)
12
+ #define TENVAD_API __attribute__((visibility("default")))
13
+ #elif defined(_WIN32) || defined(__CYGWIN__)
14
+ /**
15
+ * @def TENVAD_API
16
+ * @brief Export/import macro for ten_vad shared library symbols.
17
+ */
18
+ #ifdef TENVAD_EXPORTS
19
+ #define TENVAD_API __declspec(dllexport)
20
+ #else
21
+ #define TENVAD_API __declspec(dllimport)
22
+ #endif
23
+ #else
24
+ #define TENVAD_API
25
+ #endif
26
+
27
+ #include <stddef.h> /* size_t */
28
+ #include <stdint.h> /* int16_t */
29
+
30
+ #ifdef __cplusplus
31
+ extern "C"
32
+ {
33
+ #endif
34
+
35
+ /**
36
+ * @typedef ten_vad_handle
37
+ * @brief Opaque handle for ten_vad instance.
38
+ */
39
+ typedef void *ten_vad_handle_t;
40
+
41
+ /**
42
+ * @brief Create and initialize a ten_vad instance.
43
+ *
44
+ * @param[out] handle Pointer to receive the vad handle.
45
+ * @param[in] hop_size The number of samples between the start points of
46
+ * two consecutive analysis frames. (e.g., 256).
47
+ * @param[in] threshold VAD detection threshold ranging from [0.0, 1.0]
48
+ * (default: 0.5).
49
+ * @return 0 on success, or -1 error occurs.
50
+ */
51
+ TENVAD_API int ten_vad_create(ten_vad_handle_t *handle, size_t hop_size,
52
+ float threshold);
53
+
54
+ /**
55
+ * @brief Process one audio frame for voice activity detection.
56
+ * Must call ten_vad_init() before calling this, and ten_vad_destroy() when done.
57
+ *
58
+ * @param[in] handle Valid VAD handle returned by ten_vad_create().
59
+ * @param[in] audio_data Pointer to an array of int16_t samples,
60
+ * buffer length must equal the hop size specified at ten_vad_create.
61
+ * @param[in] audio_data_length size of audio_data buffer, here should be equal to hop_size.
62
+ * @param[out] out_probability Pointer to a float (size 1) that receives the
63
+ * voice activity probability in the range [0.0, 1.0].
64
+ * @param[out] out_flag Pointer to an int (size 1) that receives the
65
+ * detection result: 0 = no voice, 1 = voice detected.
66
+ * @return 0 on success, or -1 error occurs.
67
+ */
68
+ TENVAD_API int ten_vad_process(ten_vad_handle_t handle, const int16_t *audio_data, size_t audio_data_length,
69
+ float *out_probability, int *out_flag);
70
+
71
+ /**
72
+ * @brief Destroy a ten_vad instance and release its resources.
73
+ *
74
+ * @param[in,out] handle Pointer to the ten_vad handle; set to NULL on return.
75
+ * @return 0 on success, or -1 error occurs.
76
+ */
77
+ TENVAD_API int ten_vad_destroy(ten_vad_handle_t *handle);
78
+
79
+ /**
80
+ * @brief Get the ten_vad library version string.
81
+ *
82
+ * @return The version string (e.g., "1.0.0").
83
+ */
84
+ TENVAD_API const char *ten_vad_get_version(void);
85
+
86
+ #ifdef __cplusplus
87
+ }
88
+ #endif
89
+
90
+ #endif /* TEN_VAD_H */
Assets/Plugins/iOS/ten_vad.framework/Info.plist ADDED
Binary file (685 Bytes). View file
 
Assets/Plugins/iOS/ten_vad.framework/Modules/module.modulemap ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ framework module ten_vad {
2
+ umbrella header "ten_vad.h"
3
+ export *
4
+ module * { export * }
5
+ }
Assets/Plugins/iOS/ten_vad.framework/ten_vad ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bea8d9de252b41a23674e819b35781a55ecd6b9b71f8de52b9633ed201e0fd67
3
+ size 301408
Assets/Prefabs.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: fe14fb51e3c1a4c16a452a64aad96fc5
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Prefabs/TextBlock.prefab ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ %YAML 1.1
2
+ %TAG !u! tag:unity3d.com,2011:
3
+ --- !u!1 &4226707013875518258
4
+ GameObject:
5
+ m_ObjectHideFlags: 0
6
+ m_CorrespondingSourceObject: {fileID: 0}
7
+ m_PrefabInstance: {fileID: 0}
8
+ m_PrefabAsset: {fileID: 0}
9
+ serializedVersion: 6
10
+ m_Component:
11
+ - component: {fileID: 7041322712057853844}
12
+ m_Layer: 5
13
+ m_Name: TextBlock
14
+ m_TagString: Untagged
15
+ m_Icon: {fileID: 0}
16
+ m_NavMeshLayer: 0
17
+ m_StaticEditorFlags: 0
18
+ m_IsActive: 1
19
+ --- !u!224 &7041322712057853844
20
+ RectTransform:
21
+ m_ObjectHideFlags: 0
22
+ m_CorrespondingSourceObject: {fileID: 0}
23
+ m_PrefabInstance: {fileID: 0}
24
+ m_PrefabAsset: {fileID: 0}
25
+ m_GameObject: {fileID: 4226707013875518258}
26
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
27
+ m_LocalPosition: {x: 0, y: 0, z: 0}
28
+ m_LocalScale: {x: 1, y: 1, z: 1}
29
+ m_ConstrainProportionsScale: 0
30
+ m_Children:
31
+ - {fileID: 9066532335516898618}
32
+ m_Father: {fileID: 0}
33
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
34
+ m_AnchorMin: {x: 0, y: 0.5}
35
+ m_AnchorMax: {x: 1, y: 0.5}
36
+ m_AnchoredPosition: {x: 0, y: 0}
37
+ m_SizeDelta: {x: 0, y: 50}
38
+ m_Pivot: {x: 0.5, y: 0.5}
39
+ --- !u!1 &4808541487852061083
40
+ GameObject:
41
+ m_ObjectHideFlags: 0
42
+ m_CorrespondingSourceObject: {fileID: 0}
43
+ m_PrefabInstance: {fileID: 0}
44
+ m_PrefabAsset: {fileID: 0}
45
+ serializedVersion: 6
46
+ m_Component:
47
+ - component: {fileID: 9066532335516898618}
48
+ - component: {fileID: 8919604523772780981}
49
+ - component: {fileID: 220700122145077962}
50
+ m_Layer: 5
51
+ m_Name: ResultText
52
+ m_TagString: Untagged
53
+ m_Icon: {fileID: 0}
54
+ m_NavMeshLayer: 0
55
+ m_StaticEditorFlags: 0
56
+ m_IsActive: 1
57
+ --- !u!224 &9066532335516898618
58
+ RectTransform:
59
+ m_ObjectHideFlags: 0
60
+ m_CorrespondingSourceObject: {fileID: 0}
61
+ m_PrefabInstance: {fileID: 0}
62
+ m_PrefabAsset: {fileID: 0}
63
+ m_GameObject: {fileID: 4808541487852061083}
64
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
65
+ m_LocalPosition: {x: 0, y: 0, z: 0}
66
+ m_LocalScale: {x: 1, y: 1, z: 1}
67
+ m_ConstrainProportionsScale: 0
68
+ m_Children: []
69
+ m_Father: {fileID: 7041322712057853844}
70
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
71
+ m_AnchorMin: {x: 0, y: 0}
72
+ m_AnchorMax: {x: 1, y: 0}
73
+ m_AnchoredPosition: {x: 0, y: 12.5}
74
+ m_SizeDelta: {x: 0, y: 50}
75
+ m_Pivot: {x: 0.5, y: 0.5}
76
+ --- !u!222 &8919604523772780981
77
+ CanvasRenderer:
78
+ m_ObjectHideFlags: 0
79
+ m_CorrespondingSourceObject: {fileID: 0}
80
+ m_PrefabInstance: {fileID: 0}
81
+ m_PrefabAsset: {fileID: 0}
82
+ m_GameObject: {fileID: 4808541487852061083}
83
+ m_CullTransparentMesh: 1
84
+ --- !u!114 &220700122145077962
85
+ MonoBehaviour:
86
+ m_ObjectHideFlags: 0
87
+ m_CorrespondingSourceObject: {fileID: 0}
88
+ m_PrefabInstance: {fileID: 0}
89
+ m_PrefabAsset: {fileID: 0}
90
+ m_GameObject: {fileID: 4808541487852061083}
91
+ m_Enabled: 1
92
+ m_EditorHideFlags: 0
93
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
94
+ m_Name:
95
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text
96
+ m_Material: {fileID: 0}
97
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
98
+ m_RaycastTarget: 1
99
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
100
+ m_Maskable: 1
101
+ m_OnCullStateChanged:
102
+ m_PersistentCalls:
103
+ m_Calls: []
104
+ m_FontData:
105
+ m_Font: {fileID: 12800000, guid: 8eaccc6238a54b8488eb8fbf762bf55b, type: 3}
106
+ m_FontSize: 25
107
+ m_FontStyle: 0
108
+ m_BestFit: 0
109
+ m_MinSize: 2
110
+ m_MaxSize: 40
111
+ m_Alignment: 0
112
+ m_AlignByGeometry: 0
113
+ m_RichText: 1
114
+ m_HorizontalOverflow: 1
115
+ m_VerticalOverflow: 0
116
+ m_LineSpacing: 1
117
+ m_Text: New Text
Assets/Prefabs/TextBlock.prefab.meta ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: d518034a417554683a0deb16e57952b0
3
+ PrefabImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
Assets/Resources.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: d781418a174c84f44a444c9885660243
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Resources/NanumGothic-Regular.ttf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:76f45ef4a6bcff344c837c95a7dcc26e017e38b5846d5ae0cdcb5b86be2e2d31
3
+ size 2054744
Assets/Resources/NanumGothic-Regular.ttf.meta ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 8eaccc6238a54b8488eb8fbf762bf55b
3
+ TrueTypeFontImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 4
6
+ fontSize: 16
7
+ forceTextureCase: -2
8
+ characterSpacing: 1
9
+ characterPadding: 1
10
+ includeFontData: 1
11
+ fontNames:
12
+ - NanumGothic
13
+ fallbackFontReferences: []
14
+ customCharacters:
15
+ fontRenderingMode: 0
16
+ ascentCalculationMode: 1
17
+ useLegacyBoundsCalculation: 0
18
+ shouldRoundAdvanceValue: 1
19
+ userData:
20
+ assetBundleName:
21
+ assetBundleVariant:
Assets/Samples.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 9ddda1e9503094ddd80b02a42ca76147
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Samples/Sentis.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: a15a86e8f661e4138b7c3a3697b20e7f
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Samples/Sentis/2.5.0.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: 521e6b555bf8c4933af2486da0eb1a6e
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Samples/Sentis/2.5.0/Quantize a model.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: f34fa8d9ee74b4cc7ab3c7b827f1ed4c
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
Assets/Samples/Sentis/2.5.0/Quantize a model/Editor.meta ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fileFormatVersion: 2
2
+ guid: e1b1849bbd0809240a3b3ad44da6fd2f
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant: