
























@@ -50,6 +50,7 @@ import android.Manifest
5050import android.content.Context
5151import android.content.pm.PackageManager
5252import android.os.SystemClock
53+import android.util.Base64
5354import android.util.Log
5455import androidx.core.content.ContextCompat
5556import kotlinx.coroutines.CoroutineScope
@@ -425,6 +426,42 @@ class NodeRuntime(
425426MicCaptureManager(
426427 context = appContext,
427428 scope = scope,
429+ createTranscriptionSession = {
430+val params =
431+ buildJsonObject {
432+ put("mode", JsonPrimitive("transcription"))
433+ put("transport", JsonPrimitive("gateway-relay"))
434+ put("brain", JsonPrimitive("none"))
435+ }
436+val response =
437+ operatorSession.request(
438+"talk.session.create",
439+ params.toString(),
440+ timeoutMs = 15_000,
441+ )
442+ parseTalkSessionId(response)
443+ },
444+ appendTranscriptionAudio = { sessionId, audio, onError ->
445+val params =
446+ buildJsonObject {
447+ put("sessionId", JsonPrimitive(sessionId))
448+ put("audioBase64", JsonPrimitive(Base64.encodeToString(audio, Base64.NO_WRAP)))
449+ put("timestamp", JsonPrimitive(SystemClock.elapsedRealtime()))
450+ }
451+ operatorSession.sendRequestFrame(
452+"talk.session.appendAudio",
453+ params.toString(),
454+ timeoutMs = 8_000,
455+ ) { error -> onError(error.message) }
456+ },
457+ closeTranscriptionSession = { sessionId ->
458+val params = buildJsonObject { put("sessionId", JsonPrimitive(sessionId)) }
459+ operatorSession.request(
460+"talk.session.close",
461+ params.toString(),
462+ timeoutMs = 5_000,
463+ )
464+ },
428465 sendToGateway = { message, onRunIdKnown ->
429466val idempotencyKey = UUID.randomUUID().toString()
430467// Notify MicCaptureManager of the idempotency key *before* the network
@@ -1419,6 +1456,17 @@ class NodeRuntime(
14191456 }
14201457 }
142114581459+private fun parseTalkSessionId(response: String): String {
1460+val root = json.parseToJsonElement(response).asObjectOrNull()
1461+val sessionId =
1462+ root?.get("transcriptionSessionId").asStringOrNull()
1463+?: root?.get("sessionId").asStringOrNull()
1464+if (sessionId.isNullOrBlank()) {
1465+throw IllegalStateException("talk.session.create returned no session id")
1466+ }
1467+return sessionId
1468+ }
1469+14221470private suspend fun refreshBrandingFromGateway() {
14231471if (!_isConnected.value) return
14241472try {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。