Initial commit
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +4 -0
- .gitignore +79 -0
- Assets/Models.meta +8 -0
- Assets/Models/ko-tiny.meta +8 -0
- Assets/Models/ko-tiny/decoder_model.onnx +3 -0
- Assets/Models/ko-tiny/decoder_model.onnx.meta +17 -0
- Assets/Models/ko-tiny/decoder_with_past_model.onnx +3 -0
- Assets/Models/ko-tiny/decoder_with_past_model.onnx.meta +17 -0
- Assets/Models/ko-tiny/encoder_model.onnx +3 -0
- Assets/Models/ko-tiny/encoder_model.onnx.meta +15 -0
- Assets/Plugins.meta +8 -0
- Assets/Plugins/Android.meta +5 -0
- Assets/Plugins/Android/AndroidManifest.xml +31 -0
- Assets/Plugins/Android/AndroidManifest.xml.meta +7 -0
- Assets/Plugins/Android/libten_vad.so.meta +2 -0
- Assets/Plugins/Android64.meta +8 -0
- Assets/Plugins/Android64/libten_vad.so.meta +2 -0
- Assets/Plugins/OSX.meta +8 -0
- Assets/Plugins/OSX/ten_vad.dylib.meta +2 -0
- Assets/Plugins/WebGL.meta +8 -0
- Assets/Plugins/WebGL/ten_vad.d.ts +111 -0
- Assets/Plugins/WebGL/ten_vad.d.ts.meta +7 -0
- Assets/Plugins/WebGL/ten_vad.js +30 -0
- Assets/Plugins/WebGL/ten_vad.js.meta +7 -0
- Assets/Plugins/WebGL/ten_vad.wasm +3 -0
- Assets/Plugins/WebGL/ten_vad.wasm.meta +7 -0
- Assets/Plugins/WebGL/webgl_microphone.jslib +370 -0
- Assets/Plugins/WebGL/webgl_microphone.jslib.meta +7 -0
- Assets/Plugins/WebGL/webgl_tenvad.jslib +326 -0
- Assets/Plugins/WebGL/webgl_tenvad.jslib.meta +7 -0
- Assets/Plugins/Windows.meta +8 -0
- Assets/Plugins/Windows/ten_vad.dll.meta +2 -0
- Assets/Plugins/Windows/ten_vad.lib.meta +2 -0
- Assets/Plugins/iOS.meta +8 -0
- Assets/Plugins/iOS/ten_vad.framework.meta +2 -0
- Assets/Plugins/iOS/ten_vad.framework/Headers/ten_vad.h +90 -0
- Assets/Plugins/iOS/ten_vad.framework/Info.plist +0 -0
- Assets/Plugins/iOS/ten_vad.framework/Modules/module.modulemap +5 -0
- Assets/Plugins/iOS/ten_vad.framework/ten_vad +3 -0
- Assets/Prefabs.meta +8 -0
- Assets/Prefabs/TextBlock.prefab +117 -0
- Assets/Prefabs/TextBlock.prefab.meta +7 -0
- Assets/Resources.meta +8 -0
- Assets/Resources/NanumGothic-Regular.ttf +3 -0
- Assets/Resources/NanumGothic-Regular.ttf.meta +21 -0
- Assets/Samples.meta +8 -0
- Assets/Samples/Sentis.meta +8 -0
- Assets/Samples/Sentis/2.5.0.meta +8 -0
- Assets/Samples/Sentis/2.5.0/Quantize a model.meta +8 -0
- 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:
|