Build 126. Two reports, unrelated to each other. IPHONES REPEATING AND SKIPPING PARTS OF EVERY SENTENCE. DRIFT_LAND was 0.6 s and one segment is 0.697 s, so the position the player was being held at sat INSIDE the newest segment — a point it very often did not have yet. It got dragged to the edge, ran out of audio and stalled. Then 'stalled' and 'waiting' were both wired to seekLive(), and a seek on a live HLS stream makes the element re-buffer, which raises those same two events. So the correction caused the stall that caused the correction. On Safari, where HLS is native and a seek lands on a segment boundary, each turn of that loop replays or drops a piece of a sentence — which is exactly what was described. Three changes, all of them about not fighting the player: those two events no longer seek, the target is three segments back (~2.1 s, what an HLS player picks for itself on a live playlist), and a correction now has 5 s to settle before another may run. Costs about 1.5 s of extra delay. A listener a second further behind is following the service; one whose audio keeps jumping backwards is not. NOT YET CONFIRMED ON A REAL IPHONE — the mechanism is read off the code and the measured segment length, and the next service is the test. CANNOT SCROLL THE MONITOR WHILE LIVE. Four boxes ended their update with box.scrollTop = box.scrollHeight, unconditionally, so every sentence yanked the view back to the live edge and reading back was impossible. They now follow the bottom only while the operator is already at the bottom, and resume when they return — nothing to press either way. Trimming the top is held off while they are scrolled away too, since dropping old lines moves the text being read; the cap comes back the moment they return, with a ceiling so nothing grows all service. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
161 lines
4.1 KiB
JSON
161 lines
4.1 KiB
JSON
{
|
|
"name": "church-translate-engine",
|
|
"productName": "Church Translate",
|
|
"version": "3.23.2",
|
|
"buildNumber": 126,
|
|
"private": true,
|
|
"description": "Live sermon translation — self-contained: captures audio, transcribes, translates, and serves the congregation page itself",
|
|
"main": "main.js",
|
|
"scripts": {
|
|
"predist": "node tools/sync-build-version.js && node tools/check-packaged-files.js",
|
|
"start": "electron .",
|
|
"dist": "electron-builder --mac",
|
|
"dist:mac": "electron-builder --mac",
|
|
"dist:win": "electron-builder --win"
|
|
},
|
|
"devDependencies": {
|
|
"electron": "^33.2.0",
|
|
"electron-builder": "^25.1.8"
|
|
},
|
|
"dependencies": {
|
|
"@huggingface/transformers": "^3.8.1",
|
|
"espeak-ng": "^1.0.2",
|
|
"kokoro-js": "^1.2.1",
|
|
"qrcode": "^1.5.4",
|
|
"sherpa-onnx-node": "^1.13.6",
|
|
"tar-stream": "^3.2.1",
|
|
"unbzip2-stream": "^1.4.3",
|
|
"ws": "^8.18.0"
|
|
},
|
|
"build": {
|
|
"appId": "org.waterschurch.translate.engine",
|
|
"productName": "Church Translate",
|
|
"directories": {
|
|
"output": "dist"
|
|
},
|
|
"files": [
|
|
"main.js",
|
|
"preload.js",
|
|
"index.html",
|
|
"engine.css",
|
|
"engine.js",
|
|
"model-worker.js",
|
|
"mt-service.js",
|
|
"capture-worklet.js",
|
|
"selftest.html",
|
|
"selftest.js",
|
|
"selftest.wav",
|
|
"vendor/transformers.min.js",
|
|
"vendor/ort-wasm-simd-threaded.jsep.wasm",
|
|
"vendor/ort-wasm-simd-threaded.jsep.mjs",
|
|
"server/**/*",
|
|
"tts-service.js",
|
|
"kokoro-sidecar.js",
|
|
"voices.js",
|
|
"pt-variants.js",
|
|
"speech-text.js",
|
|
"tools/setup-local-voices.sh",
|
|
"voice-catalog.js",
|
|
"out-routing.js",
|
|
"mt-guard.js",
|
|
"liturgy.js",
|
|
"preach.js",
|
|
"spa-variants.js",
|
|
"bible-lexicon.js",
|
|
"app-log.js",
|
|
"sidecar-langs.js",
|
|
"short-questions.js",
|
|
"tools/verify-windows.js"
|
|
],
|
|
"mac": {
|
|
"target": [
|
|
{
|
|
"target": "dir",
|
|
"arch": [
|
|
"arm64"
|
|
]
|
|
},
|
|
{
|
|
"target": "dmg",
|
|
"arch": [
|
|
"arm64"
|
|
]
|
|
}
|
|
],
|
|
"category": "public.app-category.utilities",
|
|
"extendInfo": {
|
|
"NSMicrophoneUsageDescription": "Church Translate listens to the sermon audio you select so it can caption and translate it."
|
|
},
|
|
"identity": null,
|
|
"extraResources": [
|
|
{
|
|
"from": "vendor/node",
|
|
"to": "node"
|
|
},
|
|
{
|
|
"from": "vendor/cloudflared",
|
|
"to": "cloudflared"
|
|
}
|
|
],
|
|
"artifactName": "${productName}-${version}-${arch}.${ext}",
|
|
"files": [
|
|
"!node_modules/**/.cache${/*}",
|
|
"!node_modules/onnxruntime-node/bin/napi-v3/win32${/*}",
|
|
"!node_modules/onnxruntime-node/bin/napi-v3/linux${/*}",
|
|
"!node_modules/sherpa-onnx-win-x64${/*}"
|
|
]
|
|
},
|
|
"asar": false,
|
|
"buildVersion": "126",
|
|
"win": {
|
|
"target": [
|
|
{
|
|
"target": "nsis",
|
|
"arch": [
|
|
"x64"
|
|
]
|
|
},
|
|
{
|
|
"target": "zip",
|
|
"arch": [
|
|
"x64"
|
|
]
|
|
}
|
|
],
|
|
"artifactName": "${productName} Setup ${version}.${ext}",
|
|
"extraResources": [
|
|
{
|
|
"from": "vendor-win/node.exe",
|
|
"to": "node.exe"
|
|
},
|
|
{
|
|
"from": "vendor-win/cloudflared.exe",
|
|
"to": "cloudflared.exe"
|
|
},
|
|
{
|
|
"from": "vendor-win/ffmpeg.exe",
|
|
"to": "ffmpeg.exe"
|
|
},
|
|
{
|
|
"from": "vendor-win/FFMPEG-LICENSE.txt",
|
|
"to": "FFMPEG-LICENSE.txt"
|
|
}
|
|
],
|
|
"files": [
|
|
"!node_modules/**/.cache${/*}",
|
|
"!node_modules/onnxruntime-node/bin/napi-v3/darwin${/*}",
|
|
"!node_modules/onnxruntime-node/bin/napi-v3/linux${/*}",
|
|
"!node_modules/sherpa-onnx-darwin-arm64${/*}"
|
|
]
|
|
},
|
|
"nsis": {
|
|
"oneClick": false,
|
|
"perMachine": false,
|
|
"allowToChangeInstallationDirectory": true,
|
|
"createDesktopShortcut": true,
|
|
"createStartMenuShortcut": true,
|
|
"deleteAppDataOnUninstall": false
|
|
}
|
|
}
|
|
}
|