Browse Source

fix(pipeline): v2.02 - eliminate tail speech truncation on long sentences, extend finalize drain timeout to 3.5s

main
Ali Alavi 1 month ago
parent
commit
eaf0e38b02
  1. BIN
      .gradle/8.11.1/executionHistory/executionHistory.bin
  2. BIN
      .gradle/8.11.1/executionHistory/executionHistory.lock
  3. BIN
      .gradle/8.11.1/fileHashes/fileHashes.bin
  4. BIN
      .gradle/8.11.1/fileHashes/fileHashes.lock
  5. BIN
      .gradle/8.11.1/fileHashes/resourceHashesCache.bin
  6. BIN
      .gradle/buildOutputCleanup/buildOutputCleanup.lock
  7. BIN
      .gradle/file-system.probe
  8. 4
      app/build.gradle
  9. BIN
      app/build/intermediates/dex/debug/mergeProjectDexDebug/5/classes.dex
  10. 2
      app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt
  11. BIN
      app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources
  12. 4
      app/build/intermediates/manifest_merge_blame_file/debug/processDebugMainManifest/manifest-merger-blame-debug-report.txt
  13. 4
      app/build/intermediates/merged_manifest/debug/processDebugMainManifest/AndroidManifest.xml
  14. 4
      app/build/intermediates/merged_manifests/debug/processDebugManifest/AndroidManifest.xml
  15. 4
      app/build/intermediates/merged_manifests/debug/processDebugManifest/output-metadata.json
  16. 4
      app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/AndroidManifest.xml
  17. 4
      app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/output-metadata.json
  18. 4
      app/build/intermediates/processed_res/debug/processDebugResources/out/output-metadata.json
  19. BIN
      app/build/intermediates/processed_res/debug/processDebugResources/out/resources-debug.ap_
  20. BIN
      app/build/intermediates/project_dex_archive/debug/dexBuilderDebug/out/com/soniox/remotemic/MainActivity.dex
  21. BIN
      app/build/intermediates/project_dex_archive/debug/dexBuilderDebug/out/com/soniox/remotemic/StreamDictationClient.dex
  22. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab
  23. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at
  24. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab
  25. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at
  26. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab
  27. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at
  28. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab
  29. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at
  30. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab
  31. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at
  32. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab
  33. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at
  34. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab
  35. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at
  36. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab
  37. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at
  38. 2
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab
  39. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab
  40. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at
  41. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab
  42. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream
  43. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len
  44. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len
  45. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at
  46. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i
  47. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab
  48. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at
  49. BIN
      app/build/kotlin/compileDebugKotlin/cacheable/last-build.bin
  50. BIN
      app/build/kotlin/compileDebugKotlin/local-state/build-history.bin
  51. BIN
      app/build/outputs/apk/debug/app-debug.apk
  52. 4
      app/build/outputs/apk/debug/output-metadata.json
  53. BIN
      app/build/tmp/kotlin-classes/debug/com/soniox/remotemic/MainActivity.class
  54. BIN
      app/build/tmp/kotlin-classes/debug/com/soniox/remotemic/StreamDictationClient.class
  55. 2
      app/src/main/java/com/soniox/remotemic/MainActivity.kt
  56. 6
      app/src/main/java/com/soniox/remotemic/StreamDictationClient.kt
  57. 4
      mac/Info.plist
  58. 13
      server/relay_server.py

BIN
.gradle/8.11.1/executionHistory/executionHistory.bin

BIN
.gradle/8.11.1/executionHistory/executionHistory.lock

BIN
.gradle/8.11.1/fileHashes/fileHashes.bin

BIN
.gradle/8.11.1/fileHashes/fileHashes.lock

BIN
.gradle/8.11.1/fileHashes/resourceHashesCache.bin

BIN
.gradle/buildOutputCleanup/buildOutputCleanup.lock

BIN
.gradle/file-system.probe

4
app/build.gradle

@ -11,8 +11,8 @@ android {
applicationId "com.soniox.remotemic"
minSdk 24
targetSdk 34
versionCode 201
versionName "2.01"
versionCode 202
versionName "2.02"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

BIN
app/build/intermediates/dex/debug/mergeProjectDexDebug/5/classes.dex

2
app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt

@ -1,4 +1,4 @@
#Wed Aug 26 12:04:16 UTC 2026
#Wed Aug 26 12:21:37 UTC 2026
path.3=5/classes.dex
path.2=10/classes.dex
path.1=0/classes.dex

BIN
app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources

4
app/build/intermediates/manifest_merge_blame_file/debug/processDebugMainManifest/manifest-merger-blame-debug-report.txt

@ -1,8 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.soniox.remotemic"
4 android:versionCode="201"
5 android:versionName="2.01" >
4 android:versionCode="202"
5 android:versionName="2.02" >
6
7 <uses-sdk
8 android:minSdkVersion="24"

4
app/build/intermediates/merged_manifest/debug/processDebugMainManifest/AndroidManifest.xml

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.soniox.remotemic"
android:versionCode="201"
android:versionName="2.01" >
android:versionCode="202"
android:versionName="2.02" >
<uses-sdk
android:minSdkVersion="24"

4
app/build/intermediates/merged_manifests/debug/processDebugManifest/AndroidManifest.xml

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.soniox.remotemic"
android:versionCode="201"
android:versionName="2.01" >
android:versionCode="202"
android:versionName="2.02" >
<uses-sdk
android:minSdkVersion="24"

4
app/build/intermediates/merged_manifests/debug/processDebugManifest/output-metadata.json

@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 201,
"versionName": "2.01",
"versionCode": 202,
"versionName": "2.02",
"outputFile": "AndroidManifest.xml"
}
],

4
app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/AndroidManifest.xml

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.soniox.remotemic"
android:versionCode="201"
android:versionName="2.01" >
android:versionCode="202"
android:versionName="2.02" >
<uses-sdk
android:minSdkVersion="24"

4
app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/output-metadata.json

@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 201,
"versionName": "2.01",
"versionCode": 202,
"versionName": "2.02",
"outputFile": "AndroidManifest.xml"
}
],

4
app/build/intermediates/processed_res/debug/processDebugResources/out/output-metadata.json

@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 201,
"versionName": "2.01",
"versionCode": 202,
"versionName": "2.02",
"outputFile": "resources-debug.ap_"
}
],

BIN
app/build/intermediates/processed_res/debug/processDebugResources/out/resources-debug.ap_

BIN
app/build/intermediates/project_dex_archive/debug/dexBuilderDebug/out/com/soniox/remotemic/MainActivity.dex

BIN
app/build/intermediates/project_dex_archive/debug/dexBuilderDebug/out/com/soniox/remotemic/StreamDictationClient.dex

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at

2
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab

@ -1,2 +1,2 @@
9
11
0

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab

BIN
app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at

BIN
app/build/kotlin/compileDebugKotlin/cacheable/last-build.bin

BIN
app/build/kotlin/compileDebugKotlin/local-state/build-history.bin

BIN
app/build/outputs/apk/debug/app-debug.apk

4
app/build/outputs/apk/debug/output-metadata.json

@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 201,
"versionName": "2.01",
"versionCode": 202,
"versionName": "2.02",
"outputFile": "app-debug.apk"
}
],

BIN
app/build/tmp/kotlin-classes/debug/com/soniox/remotemic/MainActivity.class

BIN
app/build/tmp/kotlin-classes/debug/com/soniox/remotemic/StreamDictationClient.class

2
app/src/main/java/com/soniox/remotemic/MainActivity.kt

@ -98,7 +98,7 @@ class MainActivity : AppCompatActivity() {
setupUI()
checkPermissions()
AppLogger.log("Main", "اپلیکیشن همگام‌سازی صوتی سانی‌اوکس راه‌اندازی شد (نسخه ۲.۰۱ - v2.01)")
AppLogger.log("Main", "اپلیکیشن همگام‌سازی صوتی سانی‌اوکس راه‌اندازی شد (نسخه ۲.۰۲ - v2.02)")
// Initialize Collaborative WebSocket Client
streamDictationClient = StreamDictationClient(

6
app/src/main/java/com/soniox/remotemic/StreamDictationClient.kt

@ -352,10 +352,10 @@ class StreamDictationClient(
try {
audioRecord?.stop()
recordingThread?.join(300)
recordingThread = null
audioRecord?.release()
audioRecord = null
recordingThread?.join(150)
recordingThread = null
} catch (e: Exception) {
Log.e(tag, "Error releasing audio hardware", e)
}
@ -369,7 +369,7 @@ class StreamDictationClient(
put("cursor_pos", cursorPos)
}.toString()
ws.send(stopFrame)
AppLogger.log(tag, "⏹️ پایان ضبط. استریم مستقیم به مک...")
AppLogger.log(tag, "⏹️ پایان ضبط. دریافت متن کامل...")
} else {
// High-Speed HTTP Dictate Fallback
val pcmData = synchronized(fullAudioSessionBuffer) { fullAudioSessionBuffer.toByteArray() }

4
mac/Info.plist

@ -19,9 +19,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2.01</string>
<string>2.02</string>
<key>CFBundleVersion</key>
<string>201</string>
<string>202</string>
<key>LSMinimumSystemVersion</key>
<string>13.0</string>
<key>LSUIElement</key>

13
server/relay_server.py

@ -339,25 +339,26 @@ async def handle_phone_stream_ws(request):
logger.info("🎙️ Started Live Speech Session: %s", current_session_id)
elif msg_type == "stop":
logger.info("⏹️ Stop received for %s. Draining audio queue...", sid)
logger.info("⏹️ Stop received for %s. Draining audio queue (%d pending)...", sid, audio_queue.qsize())
# 1. Drain audio queue to Soniox with timeout
# 1. Drain audio queue to Soniox with generous timeout for long speech
try:
await asyncio.wait_for(audio_queue.join(), timeout=2.0)
await asyncio.wait_for(audio_queue.join(), timeout=3.0)
except Exception:
pass
# 2. Send finalize
# 2. Send finalize and wait for Soniox to transcribe 100% of the speech
if active_soniox_ws and is_ws_open(active_soniox_ws):
await active_soniox_ws.send(json.dumps({"type": "finalize"}))
try:
await asyncio.wait_for(stop_event.wait(), timeout=0.45)
# Generous 3.5s wait so long speech (e.g. 30-40s) is never truncated prematurely
await asyncio.wait_for(stop_event.wait(), timeout=3.5)
except asyncio.TimeoutError:
logger.info("Finalize wait completed (timeout reached)")
raw_final = "".join(full_final_tokens) + current_non_final
clean_final = sanitize_text(raw_final, allow_multiline=False, preserve_trailing_space=True)
logger.info("⚡ Session %s final text: '%s'", sid, clean_final)
logger.info("⚡ Session %s final text (%d chars): '%s'", sid, len(clean_final), clean_final)
# Return final speech text to phone (phone updates UI and broadcasts full state to Mac)
if is_ws_open(ws):

Loading…
Cancel
Save