@moolam/bindings-speech 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +41 -0
- package/bin/speech-cert.mjs +11 -0
- package/certification/README.md +18 -0
- package/certification/device-profiles/mid-range-android.json +12 -0
- package/certification/profile.json +33 -0
- package/certification/prove-speech-cert.mjs +11 -0
- package/certification/reports/prove.green1.speech.cert.json +92 -0
- package/certification/reports/prove.seeded-red.speech.cert.json +70 -0
- package/certification/reports/speech.cert.json +92 -0
- package/certification/run-speech-cert.mjs +11 -0
- package/certification/schemas/speech.cert.report.schema.json +149 -0
- package/certification/voice-rtt.baseline.json +12 -0
- package/dist/edge_stt_harness.d.ts +86 -0
- package/dist/edge_stt_harness.d.ts.map +1 -0
- package/dist/edge_stt_harness.js +311 -0
- package/dist/edge_stt_harness.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/speech_certification.d.ts +149 -0
- package/dist/speech_certification.d.ts.map +1 -0
- package/dist/speech_certification.js +490 -0
- package/dist/speech_certification.js.map +1 -0
- package/dist/stt_binding.d.ts +148 -0
- package/dist/stt_binding.d.ts.map +1 -0
- package/dist/stt_binding.js +400 -0
- package/dist/stt_binding.js.map +1 -0
- package/dist/tts_binding.d.ts +187 -0
- package/dist/tts_binding.d.ts.map +1 -0
- package/dist/tts_binding.js +565 -0
- package/dist/tts_binding.js.map +1 -0
- package/dist/voice_rtt_proof.d.ts +112 -0
- package/dist/voice_rtt_proof.d.ts.map +1 -0
- package/dist/voice_rtt_proof.js +241 -0
- package/dist/voice_rtt_proof.js.map +1 -0
- package/dist/whisper_ffi.d.ts +44 -0
- package/dist/whisper_ffi.d.ts.map +1 -0
- package/dist/whisper_ffi.js +104 -0
- package/dist/whisper_ffi.js.map +1 -0
- package/fixtures/indic/audio/en-classroom.pcm +0 -0
- package/fixtures/indic/audio/hi-classroom-noise.pcm +0 -0
- package/fixtures/indic/audio/hi-en-codeswitch.pcm +0 -0
- package/fixtures/indic/audio/hi-greeting.pcm +0 -0
- package/fixtures/indic/audio/short-hi.pcm +0 -0
- package/fixtures/indic/audio/ta-greeting.pcm +0 -0
- package/fixtures/indic/catalog.json +75 -0
- package/fixtures/indic/supported-languages.json +8 -0
- package/fixtures/tts/tts-voices.model-card.json +41 -0
- package/fixtures/tts/voices.json +24 -0
- package/package.json +55 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://moolam.ai/schemas/bindings-speech.speech-cert.report.v1.json",
|
|
4
|
+
"title": "Speech certification report",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"schemaVersion",
|
|
9
|
+
"profileId",
|
|
10
|
+
"outcome",
|
|
11
|
+
"subjectId",
|
|
12
|
+
"deviceId",
|
|
13
|
+
"exitCode",
|
|
14
|
+
"bindings",
|
|
15
|
+
"indicFixtures",
|
|
16
|
+
"voiceRtt",
|
|
17
|
+
"failures",
|
|
18
|
+
"telemetry"
|
|
19
|
+
],
|
|
20
|
+
"properties": {
|
|
21
|
+
"schemaVersion": {
|
|
22
|
+
"const": "bindings-speech.speech-cert.report.v1"
|
|
23
|
+
},
|
|
24
|
+
"profileId": { "type": "string", "minLength": 1 },
|
|
25
|
+
"outcome": { "enum": ["pass", "fail"] },
|
|
26
|
+
"subjectId": { "type": "string", "minLength": 1 },
|
|
27
|
+
"deviceId": { "type": "string", "minLength": 1 },
|
|
28
|
+
"exitCode": { "enum": [0, 1] },
|
|
29
|
+
"bindings": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"minItems": 1,
|
|
32
|
+
"items": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"additionalProperties": false,
|
|
35
|
+
"required": ["binding", "engine", "outcome", "exitCode", "passed", "failed", "verdicts"],
|
|
36
|
+
"properties": {
|
|
37
|
+
"binding": { "enum": ["stt", "tts"] },
|
|
38
|
+
"engine": { "type": "string", "minLength": 1 },
|
|
39
|
+
"outcome": { "enum": ["pass", "fail"] },
|
|
40
|
+
"exitCode": { "enum": [0, 1] },
|
|
41
|
+
"passed": { "type": "integer", "minimum": 0 },
|
|
42
|
+
"failed": { "type": "integer", "minimum": 0 },
|
|
43
|
+
"verdicts": {
|
|
44
|
+
"type": "array",
|
|
45
|
+
"items": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"additionalProperties": false,
|
|
48
|
+
"required": ["obligationId", "outcome", "mustText"],
|
|
49
|
+
"properties": {
|
|
50
|
+
"obligationId": { "type": "string" },
|
|
51
|
+
"outcome": { "type": "string" },
|
|
52
|
+
"mustText": { "type": "string" },
|
|
53
|
+
"message": { "type": "string" }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"indicFixtures": {
|
|
61
|
+
"type": "object",
|
|
62
|
+
"additionalProperties": false,
|
|
63
|
+
"required": ["outcome", "utteranceCount", "failures"],
|
|
64
|
+
"properties": {
|
|
65
|
+
"outcome": { "enum": ["pass", "fail"] },
|
|
66
|
+
"utteranceCount": { "type": "integer", "minimum": 0 },
|
|
67
|
+
"failures": {
|
|
68
|
+
"type": "array",
|
|
69
|
+
"items": { "type": "string" }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"voiceRtt": {
|
|
74
|
+
"oneOf": [
|
|
75
|
+
{ "type": "null" },
|
|
76
|
+
{
|
|
77
|
+
"type": "object",
|
|
78
|
+
"additionalProperties": false,
|
|
79
|
+
"required": [
|
|
80
|
+
"nfrId",
|
|
81
|
+
"metric",
|
|
82
|
+
"outcome",
|
|
83
|
+
"ok",
|
|
84
|
+
"measuredP95Ms",
|
|
85
|
+
"budgetP95Ms",
|
|
86
|
+
"baselineP95Ms",
|
|
87
|
+
"allowedRelativeP95Ms",
|
|
88
|
+
"absoluteOk",
|
|
89
|
+
"relativeOk",
|
|
90
|
+
"sampleCount",
|
|
91
|
+
"samplesMs",
|
|
92
|
+
"deviceProfileId",
|
|
93
|
+
"subjectId",
|
|
94
|
+
"deviceId",
|
|
95
|
+
"clock",
|
|
96
|
+
"failures",
|
|
97
|
+
"policy"
|
|
98
|
+
],
|
|
99
|
+
"properties": {
|
|
100
|
+
"nfrId": { "const": "NFR-07" },
|
|
101
|
+
"metric": { "const": "final_transcript_to_first_audio" },
|
|
102
|
+
"outcome": { "enum": ["pass", "fail"] },
|
|
103
|
+
"ok": { "type": "boolean" },
|
|
104
|
+
"measuredP95Ms": { "type": "number" },
|
|
105
|
+
"budgetP95Ms": { "type": "number" },
|
|
106
|
+
"baselineP95Ms": { "type": "number" },
|
|
107
|
+
"allowedRelativeP95Ms": { "type": "number" },
|
|
108
|
+
"absoluteOk": { "type": "boolean" },
|
|
109
|
+
"relativeOk": { "type": "boolean" },
|
|
110
|
+
"sampleCount": { "type": "integer", "minimum": 0 },
|
|
111
|
+
"samplesMs": {
|
|
112
|
+
"type": "array",
|
|
113
|
+
"items": { "type": "number" }
|
|
114
|
+
},
|
|
115
|
+
"deviceProfileId": { "type": "string" },
|
|
116
|
+
"subjectId": { "type": "string" },
|
|
117
|
+
"deviceId": { "type": "string" },
|
|
118
|
+
"clock": { "const": "performance.now" },
|
|
119
|
+
"failures": {
|
|
120
|
+
"type": "array",
|
|
121
|
+
"items": { "type": "string" }
|
|
122
|
+
},
|
|
123
|
+
"policy": {
|
|
124
|
+
"const": "absolute-ceiling-plus-relative-baseline"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
"failures": {
|
|
131
|
+
"type": "array",
|
|
132
|
+
"items": { "type": "string" }
|
|
133
|
+
},
|
|
134
|
+
"telemetry": {
|
|
135
|
+
"type": "object",
|
|
136
|
+
"additionalProperties": false,
|
|
137
|
+
"required": ["event", "subjectId", "deviceId", "outcome"],
|
|
138
|
+
"properties": {
|
|
139
|
+
"event": { "const": "bindings_speech.speech_cert" },
|
|
140
|
+
"subjectId": { "type": "string" },
|
|
141
|
+
"deviceId": { "type": "string" },
|
|
142
|
+
"outcome": { "enum": ["pass", "fail"] },
|
|
143
|
+
"bindingCount": { "type": "integer" },
|
|
144
|
+
"fixtureCount": { "type": "integer" },
|
|
145
|
+
"voiceRttOk": { "type": "boolean" }
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "bindings-speech.voice-rtt-baseline.v1",
|
|
3
|
+
"nfrId": "NFR-07",
|
|
4
|
+
"metric": "final_transcript_to_first_audio",
|
|
5
|
+
"deviceProfileId": "android-mid-range-voice",
|
|
6
|
+
"p95Ms": 80,
|
|
7
|
+
"tolerancePercent": 100,
|
|
8
|
+
"sampleCount": 6,
|
|
9
|
+
"warmupCount": 1,
|
|
10
|
+
"notes": "In-process STT/TTS CI stand-in baseline. Absolute NFR-07 ceiling remains 2500ms; relative gate catches regressions vs this recorded p95. Refresh intentionally after perf work — never auto-raise.",
|
|
11
|
+
"recordedAt": "2026-07-16T00:00:00.000Z"
|
|
12
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge harness integration: inject whisper.cpp-class SpeechInterface into
|
|
3
|
+
* CognitiveBindings / EdgeAgent, prove offline STT under network deny.
|
|
4
|
+
*/
|
|
5
|
+
import { createEdgeCognitiveBindings, LocalVectorDb, type AgentReply } from "@moolam/edge-agent";
|
|
6
|
+
import type { SpeechInterface } from "@moolam/contracts";
|
|
7
|
+
import { type LoadWhisperCppSpeechOptions } from "./stt_binding.js";
|
|
8
|
+
/** Repo-relative from packages/bindings-speech (src or dist). */
|
|
9
|
+
export declare const OFFLINE_EDGE_GOLDEN_RELPATH = "../../examples/offline-edge/golden-turn.json";
|
|
10
|
+
export type OfflineEdgeSttTelemetry = {
|
|
11
|
+
event: "bindings_speech.offline_edge_stt";
|
|
12
|
+
outcome: "start" | "pass" | "fail" | "egress_fail" | "bindings_ok" | "partials_ok" | "core_ok" | "subject_isolation_ok";
|
|
13
|
+
subjectId: string;
|
|
14
|
+
deviceId: string;
|
|
15
|
+
fixtureId?: string;
|
|
16
|
+
detail?: string;
|
|
17
|
+
};
|
|
18
|
+
export type ProveOfflineEdgeSttOptions = {
|
|
19
|
+
subjectId?: string;
|
|
20
|
+
deviceId?: string;
|
|
21
|
+
/** Indic fixture id (default: hi-en-codeswitch). */
|
|
22
|
+
fixtureId?: string;
|
|
23
|
+
speechOptions?: Omit<LoadWhisperCppSpeechOptions, "subjectId" | "deviceId">;
|
|
24
|
+
onTelemetry?: (event: OfflineEdgeSttTelemetry) => void;
|
|
25
|
+
};
|
|
26
|
+
export type ProveOfflineEdgeSttResult = {
|
|
27
|
+
ok: boolean;
|
|
28
|
+
subjectId: string;
|
|
29
|
+
deviceId: string;
|
|
30
|
+
fixtureId: string;
|
|
31
|
+
speechBound: boolean;
|
|
32
|
+
supportedLanguages: string[];
|
|
33
|
+
partialBeforeFinal: boolean;
|
|
34
|
+
finalText: string;
|
|
35
|
+
servedLocally: boolean;
|
|
36
|
+
syncStatus: string | null;
|
|
37
|
+
egressAttemptCount: number;
|
|
38
|
+
localityOk: boolean;
|
|
39
|
+
cognitiveCoreOk: boolean;
|
|
40
|
+
subjectIsolationOk: boolean;
|
|
41
|
+
reply: AgentReply | null;
|
|
42
|
+
failures: string[];
|
|
43
|
+
};
|
|
44
|
+
declare function mockRuntime(): {
|
|
45
|
+
card: {
|
|
46
|
+
modelId: string;
|
|
47
|
+
contextWindow: number;
|
|
48
|
+
quantization: string;
|
|
49
|
+
memoryFootprintMiB: number;
|
|
50
|
+
languages: string[];
|
|
51
|
+
};
|
|
52
|
+
load: () => Promise<void>;
|
|
53
|
+
unload: () => Promise<void>;
|
|
54
|
+
generate: ({ prompt }: {
|
|
55
|
+
prompt: string;
|
|
56
|
+
}) => Promise<{
|
|
57
|
+
text: string;
|
|
58
|
+
tokensPerSecond: number;
|
|
59
|
+
finishReason: "stop";
|
|
60
|
+
}>;
|
|
61
|
+
generateStream: ({ prompt }: {
|
|
62
|
+
prompt: string;
|
|
63
|
+
}) => AsyncGenerator<string, void, unknown>;
|
|
64
|
+
embed: (text: string) => Promise<Float32Array<ArrayBuffer>>;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Assemble edge CognitiveBindings with an injected SpeechInterface
|
|
68
|
+
* (same override pattern as tools/knowledge).
|
|
69
|
+
*/
|
|
70
|
+
export declare function createEdgeBindingsWithSpeech(args: {
|
|
71
|
+
subjectId: string;
|
|
72
|
+
deviceId: string;
|
|
73
|
+
speech: SpeechInterface;
|
|
74
|
+
runtime?: ReturnType<typeof mockRuntime>;
|
|
75
|
+
vectorDb: LocalVectorDb;
|
|
76
|
+
track?: string;
|
|
77
|
+
language?: string;
|
|
78
|
+
activeConceptId?: string | null;
|
|
79
|
+
}): ReturnType<typeof createEdgeCognitiveBindings>;
|
|
80
|
+
/**
|
|
81
|
+
* Prove: local STT on Indic fixture → edge binding set → CognitiveCore /
|
|
82
|
+
* EdgeAgent turn with network denied (no sync transport).
|
|
83
|
+
*/
|
|
84
|
+
export declare function proveOfflineEdgeSttBinding(options?: ProveOfflineEdgeSttOptions): Promise<ProveOfflineEdgeSttResult>;
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=edge_stt_harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge_stt_harness.d.ts","sourceRoot":"","sources":["../src/edge_stt_harness.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAEL,2BAA2B,EAE3B,aAAa,EACb,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAIL,KAAK,2BAA2B,EAGjC,MAAM,kBAAkB,CAAC;AAK1B,iEAAiE;AACjE,eAAO,MAAM,2BAA2B,iDACQ,CAAC;AAEjD,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,kCAAkC,CAAC;IAC1C,OAAO,EACH,OAAO,GACP,MAAM,GACN,MAAM,GACN,aAAa,GACb,aAAa,GACb,aAAa,GACb,SAAS,GACT,sBAAsB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,IAAI,CAAC,2BAA2B,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;IAC5E,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AA2BF,iBAAS,WAAW;;;;;;;;;;2BAWa;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;;;;;iCAKF;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;kBAK3C,MAAM;EAM7B;AAYD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACzC,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,GAAG,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAWjD;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CAwQpC"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge harness integration: inject whisper.cpp-class SpeechInterface into
|
|
3
|
+
* CognitiveBindings / EdgeAgent, prove offline STT under network deny.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { DEFAULT_SOVEREIGN_LOCALITY_POLICY, assertLocality, collectTranscriptSegments, hasPartialBeforeFinal, withEgressRecordingTurn, } from "@moolam/contract-conformance";
|
|
9
|
+
import { CognitiveCore } from "@moolam/cognitive-core";
|
|
10
|
+
import { EdgeAgent, createEdgeCognitiveBindings, createLocalVectorMemoryDriver, LocalVectorDb, } from "@moolam/edge-agent";
|
|
11
|
+
import { indicFixtureAsAudioStream, loadIndicUtteranceFixture, loadWhisperCppSpeech, } from "./stt_binding.js";
|
|
12
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const PACKAGE_ROOT = path.resolve(__dirname, "..");
|
|
14
|
+
/** Repo-relative from packages/bindings-speech (src or dist). */
|
|
15
|
+
export const OFFLINE_EDGE_GOLDEN_RELPATH = "../../examples/offline-edge/golden-turn.json";
|
|
16
|
+
function loadGolden() {
|
|
17
|
+
const goldenPath = path.resolve(PACKAGE_ROOT, OFFLINE_EDGE_GOLDEN_RELPATH);
|
|
18
|
+
if (!existsSync(goldenPath)) {
|
|
19
|
+
throw new Error(`offline-edge golden missing at ${goldenPath}`);
|
|
20
|
+
}
|
|
21
|
+
return JSON.parse(readFileSync(goldenPath, "utf8"));
|
|
22
|
+
}
|
|
23
|
+
function mockRuntime() {
|
|
24
|
+
return {
|
|
25
|
+
card: {
|
|
26
|
+
modelId: "mock-phi-speech-edge",
|
|
27
|
+
contextWindow: 4096,
|
|
28
|
+
quantization: "q4",
|
|
29
|
+
memoryFootprintMiB: 64,
|
|
30
|
+
languages: ["en-IN", "hi-IN"],
|
|
31
|
+
},
|
|
32
|
+
load: async () => { },
|
|
33
|
+
unload: async () => { },
|
|
34
|
+
generate: async ({ prompt }) => ({
|
|
35
|
+
text: `On-device reply grounded in prompt of ${prompt.length} chars.`,
|
|
36
|
+
tokensPerSecond: 40,
|
|
37
|
+
finishReason: "stop",
|
|
38
|
+
}),
|
|
39
|
+
generateStream: async function* ({ prompt }) {
|
|
40
|
+
const t = `On-device reply grounded in prompt of ${prompt.length} chars.`;
|
|
41
|
+
yield t.slice(0, 8);
|
|
42
|
+
yield t.slice(8);
|
|
43
|
+
},
|
|
44
|
+
embed: async (text) => {
|
|
45
|
+
const out = new Float32Array(8);
|
|
46
|
+
out[0] = (text.length % 97) / 97;
|
|
47
|
+
return out;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function emit(options, partial) {
|
|
52
|
+
options.onTelemetry?.({
|
|
53
|
+
event: "bindings_speech.offline_edge_stt",
|
|
54
|
+
...partial,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Assemble edge CognitiveBindings with an injected SpeechInterface
|
|
59
|
+
* (same override pattern as tools/knowledge).
|
|
60
|
+
*/
|
|
61
|
+
export function createEdgeBindingsWithSpeech(args) {
|
|
62
|
+
return createEdgeCognitiveBindings({
|
|
63
|
+
subjectId: args.subjectId,
|
|
64
|
+
deviceId: args.deviceId,
|
|
65
|
+
runtime: args.runtime ?? mockRuntime(),
|
|
66
|
+
vectorDb: args.vectorDb,
|
|
67
|
+
track: args.track ?? "system-design-l5",
|
|
68
|
+
language: args.language ?? "en-IN",
|
|
69
|
+
activeConceptId: args.activeConceptId ?? "sd.consistent-hashing",
|
|
70
|
+
speech: args.speech,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Prove: local STT on Indic fixture → edge binding set → CognitiveCore /
|
|
75
|
+
* EdgeAgent turn with network denied (no sync transport).
|
|
76
|
+
*/
|
|
77
|
+
export async function proveOfflineEdgeSttBinding(options = {}) {
|
|
78
|
+
const golden = loadGolden();
|
|
79
|
+
const subjectId = (options.subjectId ?? "subj.speech.offline").trim();
|
|
80
|
+
const deviceId = (options.deviceId ?? "dev-speech-offline").trim();
|
|
81
|
+
const fixtureId = options.fixtureId ?? "hi-en-codeswitch";
|
|
82
|
+
const failures = [];
|
|
83
|
+
emit(options, {
|
|
84
|
+
outcome: "start",
|
|
85
|
+
subjectId,
|
|
86
|
+
deviceId,
|
|
87
|
+
fixtureId,
|
|
88
|
+
});
|
|
89
|
+
let speech = null;
|
|
90
|
+
let finalText = "";
|
|
91
|
+
let partialBeforeFinal = false;
|
|
92
|
+
let speechBound = false;
|
|
93
|
+
let supportedLanguages = [];
|
|
94
|
+
let reply = null;
|
|
95
|
+
let servedLocally = false;
|
|
96
|
+
let syncStatus = null;
|
|
97
|
+
let egressAttemptCount = 0;
|
|
98
|
+
let localityOk = false;
|
|
99
|
+
let cognitiveCoreOk = false;
|
|
100
|
+
let subjectIsolationOk = false;
|
|
101
|
+
try {
|
|
102
|
+
const sttEvents = [];
|
|
103
|
+
speech = await loadWhisperCppSpeech({
|
|
104
|
+
subjectId,
|
|
105
|
+
deviceId,
|
|
106
|
+
...(options.speechOptions ?? {}),
|
|
107
|
+
onTelemetry: (e) => {
|
|
108
|
+
sttEvents.push(e);
|
|
109
|
+
options.speechOptions?.onTelemetry?.(e);
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
supportedLanguages = speech.supportedLanguages;
|
|
113
|
+
const fixture = loadIndicUtteranceFixture(fixtureId);
|
|
114
|
+
const friction = {
|
|
115
|
+
conceptId: golden.friction.conceptId,
|
|
116
|
+
hesitationMs: golden.friction.hesitationMs,
|
|
117
|
+
inputVelocity: golden.friction.inputVelocity,
|
|
118
|
+
revisionCount: golden.friction.revisionCount,
|
|
119
|
+
assistanceRequested: golden.friction.assistanceRequested,
|
|
120
|
+
outcome: (golden.friction.outcome === "correct" ||
|
|
121
|
+
golden.friction.outcome === "partial" ||
|
|
122
|
+
golden.friction.outcome === "incorrect"
|
|
123
|
+
? golden.friction.outcome
|
|
124
|
+
: "ungraded"),
|
|
125
|
+
capturedAt: golden.friction.capturedAt,
|
|
126
|
+
};
|
|
127
|
+
const { turn, value } = await withEgressRecordingTurn({
|
|
128
|
+
subjectId,
|
|
129
|
+
deviceId,
|
|
130
|
+
caller: { principalId: "offline-edge-stt", subjectScope: "*" },
|
|
131
|
+
selfHostedHosts: ["school.local"],
|
|
132
|
+
}, async (api) => {
|
|
133
|
+
const mock = api.mockAgent();
|
|
134
|
+
mock
|
|
135
|
+
?.get("https://vendor.example")
|
|
136
|
+
.intercept({ path: "/v1/infer", method: "POST" })
|
|
137
|
+
.reply(200, { ok: true })
|
|
138
|
+
.times(5);
|
|
139
|
+
return api.withPayloadClass("model-prompt", async () => {
|
|
140
|
+
const segs = await collectTranscriptSegments(speech.transcribe(indicFixtureAsAudioStream(fixture)));
|
|
141
|
+
const partialOk = hasPartialBeforeFinal(segs);
|
|
142
|
+
const last = segs.filter((s) => s.isFinal).at(-1);
|
|
143
|
+
const transcript = last?.text?.trim() ?? "";
|
|
144
|
+
const db = new LocalVectorDb(createLocalVectorMemoryDriver());
|
|
145
|
+
await db.initialize();
|
|
146
|
+
const { bindings, profile } = createEdgeBindingsWithSpeech({
|
|
147
|
+
subjectId,
|
|
148
|
+
deviceId,
|
|
149
|
+
speech: speech,
|
|
150
|
+
vectorDb: db,
|
|
151
|
+
track: golden.profile.track,
|
|
152
|
+
language: golden.profile.language,
|
|
153
|
+
activeConceptId: golden.friction.conceptId,
|
|
154
|
+
});
|
|
155
|
+
const bound = bindings.speech === speech;
|
|
156
|
+
const core = new CognitiveCore(profile, bindings);
|
|
157
|
+
const coreOut = await core.turn({
|
|
158
|
+
subjectId,
|
|
159
|
+
sessionId: `sess.speech.${deviceId}`,
|
|
160
|
+
utterance: transcript || golden.utterance,
|
|
161
|
+
});
|
|
162
|
+
const coreOk = typeof coreOut.reply === "string" && coreOut.reply.length > 0;
|
|
163
|
+
const agent = new EdgeAgent({
|
|
164
|
+
subjectId,
|
|
165
|
+
deviceId,
|
|
166
|
+
runtime: mockRuntime(),
|
|
167
|
+
storage: createLocalVectorMemoryDriver(),
|
|
168
|
+
speech: speech,
|
|
169
|
+
profile: golden.profile,
|
|
170
|
+
attachEventBusSpans: false,
|
|
171
|
+
});
|
|
172
|
+
await agent.initialize();
|
|
173
|
+
const agentReply = await agent.agentTurn(transcript || golden.utterance, friction);
|
|
174
|
+
const sync = await agent.syncNow();
|
|
175
|
+
const peerSpeech = await loadWhisperCppSpeech({
|
|
176
|
+
subjectId: `${subjectId}::peer`,
|
|
177
|
+
deviceId: `${deviceId}-peer`,
|
|
178
|
+
});
|
|
179
|
+
const peerDb = new LocalVectorDb(createLocalVectorMemoryDriver());
|
|
180
|
+
await peerDb.initialize();
|
|
181
|
+
const peerBundle = createEdgeBindingsWithSpeech({
|
|
182
|
+
subjectId: `${subjectId}::peer`,
|
|
183
|
+
deviceId: `${deviceId}-peer`,
|
|
184
|
+
speech: peerSpeech,
|
|
185
|
+
vectorDb: peerDb,
|
|
186
|
+
});
|
|
187
|
+
const isolationOk = peerBundle.bindings.speech === peerSpeech &&
|
|
188
|
+
bindings.speech === speech &&
|
|
189
|
+
peerBundle.bindings.speech !== bindings.speech;
|
|
190
|
+
await peerSpeech.unload();
|
|
191
|
+
return {
|
|
192
|
+
segs,
|
|
193
|
+
partialOk,
|
|
194
|
+
transcript,
|
|
195
|
+
bound,
|
|
196
|
+
coreOk,
|
|
197
|
+
agentReply,
|
|
198
|
+
syncStatus: sync.status,
|
|
199
|
+
isolationOk,
|
|
200
|
+
sttEvents,
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
egressAttemptCount = turn.attempts.length;
|
|
205
|
+
const asserted = assertLocality(turn, DEFAULT_SOVEREIGN_LOCALITY_POLICY);
|
|
206
|
+
localityOk = asserted.ok === true && turn.noEgress === true;
|
|
207
|
+
if (!localityOk) {
|
|
208
|
+
failures.push(`locality breach: attempts=${egressAttemptCount} ok=${asserted.ok}`);
|
|
209
|
+
emit(options, {
|
|
210
|
+
outcome: "egress_fail",
|
|
211
|
+
subjectId,
|
|
212
|
+
deviceId,
|
|
213
|
+
fixtureId,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
partialBeforeFinal = value.partialOk;
|
|
217
|
+
finalText = value.transcript;
|
|
218
|
+
speechBound = value.bound;
|
|
219
|
+
cognitiveCoreOk = value.coreOk;
|
|
220
|
+
reply = value.agentReply;
|
|
221
|
+
servedLocally = Boolean(reply?.servedLocally);
|
|
222
|
+
syncStatus = value.syncStatus;
|
|
223
|
+
subjectIsolationOk = value.isolationOk;
|
|
224
|
+
if (!partialBeforeFinal) {
|
|
225
|
+
failures.push("STT must emit isFinal:false before isFinal:true on fixture");
|
|
226
|
+
}
|
|
227
|
+
if (!finalText)
|
|
228
|
+
failures.push("STT final transcript empty");
|
|
229
|
+
if (!speechBound) {
|
|
230
|
+
failures.push("bindings.speech was not the injected SpeechInterface");
|
|
231
|
+
}
|
|
232
|
+
if (!cognitiveCoreOk) {
|
|
233
|
+
failures.push("CognitiveCore.turn with speech-bound bindings failed");
|
|
234
|
+
}
|
|
235
|
+
if (!servedLocally)
|
|
236
|
+
failures.push("agentTurn not servedLocally");
|
|
237
|
+
if (syncStatus !== "offline-mode") {
|
|
238
|
+
failures.push(`expected offline-mode sync, got ${syncStatus}`);
|
|
239
|
+
}
|
|
240
|
+
if (!subjectIsolationOk) {
|
|
241
|
+
failures.push("concurrent speech bindings cross-contaminated");
|
|
242
|
+
}
|
|
243
|
+
if (value.sttEvents.some((e) => finalText.length > 8 && JSON.stringify(e).includes(finalText))) {
|
|
244
|
+
failures.push("STT telemetry leaked transcript body");
|
|
245
|
+
}
|
|
246
|
+
emit(options, {
|
|
247
|
+
outcome: partialBeforeFinal ? "partials_ok" : "fail",
|
|
248
|
+
subjectId,
|
|
249
|
+
deviceId,
|
|
250
|
+
fixtureId,
|
|
251
|
+
});
|
|
252
|
+
emit(options, {
|
|
253
|
+
outcome: speechBound ? "bindings_ok" : "fail",
|
|
254
|
+
subjectId,
|
|
255
|
+
deviceId,
|
|
256
|
+
fixtureId,
|
|
257
|
+
});
|
|
258
|
+
emit(options, {
|
|
259
|
+
outcome: cognitiveCoreOk ? "core_ok" : "fail",
|
|
260
|
+
subjectId,
|
|
261
|
+
deviceId,
|
|
262
|
+
fixtureId,
|
|
263
|
+
});
|
|
264
|
+
emit(options, {
|
|
265
|
+
outcome: subjectIsolationOk ? "subject_isolation_ok" : "fail",
|
|
266
|
+
subjectId,
|
|
267
|
+
deviceId,
|
|
268
|
+
fixtureId,
|
|
269
|
+
});
|
|
270
|
+
await speech.unload();
|
|
271
|
+
speech = null;
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
failures.push(err instanceof Error ? err.message : String(err));
|
|
275
|
+
if (speech) {
|
|
276
|
+
try {
|
|
277
|
+
await speech.unload();
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
/* ignore */
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const ok = failures.length === 0;
|
|
285
|
+
emit(options, {
|
|
286
|
+
outcome: ok ? "pass" : "fail",
|
|
287
|
+
subjectId,
|
|
288
|
+
deviceId,
|
|
289
|
+
fixtureId,
|
|
290
|
+
...(ok ? {} : { detail: failures[0] }),
|
|
291
|
+
});
|
|
292
|
+
return {
|
|
293
|
+
ok,
|
|
294
|
+
subjectId,
|
|
295
|
+
deviceId,
|
|
296
|
+
fixtureId,
|
|
297
|
+
speechBound,
|
|
298
|
+
supportedLanguages,
|
|
299
|
+
partialBeforeFinal,
|
|
300
|
+
finalText,
|
|
301
|
+
servedLocally,
|
|
302
|
+
syncStatus,
|
|
303
|
+
egressAttemptCount,
|
|
304
|
+
localityOk,
|
|
305
|
+
cognitiveCoreOk,
|
|
306
|
+
subjectIsolationOk,
|
|
307
|
+
reply,
|
|
308
|
+
failures,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=edge_stt_harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge_stt_harness.js","sourceRoot":"","sources":["../src/edge_stt_harness.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @moolam/bindings-speech — local Indic speech (whisper.cpp-class STT).
|
|
3
|
+
*/
|
|
4
|
+
export { createInProcessWhisperCppBackend, type WhisperCppNativeBackend, type WhisperCppNativeHandle, type WhisperCppTranscribeNativeParams, type WhisperCppTranscribeNativeResult, } from "./whisper_ffi.js";
|
|
5
|
+
export { DEFAULT_INDIC_LANGUAGES_MANIFEST, DEFAULT_INDIC_UTTERANCE_CATALOG, INDIC_FIXTURES_DIR, PACKAGE_ROOT, SPEECH_SAMPLE_RATE_HZ, SPEECH_STREAM_CHUNK_LIMIT, WHISPER_CPP_CLASS_ENGINE, WhisperCppSpeechBinding, WhisperCppSpeechError, createWhisperCppSpeechHarnessFactory, indicFixtureAsAudioStream, listIndicUtteranceIds, loadAllIndicUtteranceFixtures, loadIndicLanguagesManifest, loadIndicUtteranceCatalog, loadIndicUtteranceFixture, loadWhisperCppSpeech, type CreateWhisperCppSpeechHarnessOptions, type IndicLanguagesManifest, type IndicUtteranceCatalog, type IndicUtteranceFixture, type IndicUtteranceFixtureMeta, type IndicUtteranceKind, type LoadWhisperCppSpeechOptions, type WhisperCppSttTelemetryEvent, type WhisperCppSttTelemetryOp, } from "./stt_binding.js";
|
|
6
|
+
export { OFFLINE_EDGE_GOLDEN_RELPATH, createEdgeBindingsWithSpeech, proveOfflineEdgeSttBinding, type OfflineEdgeSttTelemetry, type ProveOfflineEdgeSttOptions, type ProveOfflineEdgeSttResult, } from "./edge_stt_harness.js";
|
|
7
|
+
export { DEFAULT_SPEECH_CERT_PROFILE, DEFAULT_SPEECH_CERT_REPORT, SPEECH_CERT_OBLIGATION_IDS, SPEECH_CERT_REPORT_SCHEMA_VERSION, SPEECH_PACKAGE_ROOT, loadSpeechCertProfile, parseSpeechCertArgv, proveSpeechCertificationGate, runIndicFixtureGate, runSpeechCertCli, runSpeechCertification, type ProveSpeechCertResult, type RunSpeechCertificationOptions, type SpeechCertBindingId, type SpeechCertBindingResult, type SpeechCertIo, type SpeechCertProfile, type SpeechCertReport, } from "./speech_certification.js";
|
|
8
|
+
export { DEFAULT_VOICE_RTT_BASELINE, DEFAULT_VOICE_RTT_DEVICE_PROFILE, NFR_07_BUDGET_P95_MS, NFR_07_ID, createDelayedFirstAudioTtsBackend, evaluateVoiceRttGates, loadVoiceRttBaseline, loadVoiceRttDeviceProfile, measureOneVoiceRttSample, percentileMs, runVoiceRttProof, type RunVoiceRttProofOptions, type VoiceRttBaseline, type VoiceRttDeviceProfile, type VoiceRttProofResult, type VoiceRttSample, } from "./voice_rtt_proof.js";
|
|
9
|
+
export { DEFAULT_TTS_MODEL_CARD, DEFAULT_TTS_VOICES_MANIFEST, LOCAL_TTS_ENGINE, TTS_PACKAGE_ROOT, TTS_SAMPLE_RATE_HZ, TTS_STREAM_CHUNK_LIMIT, TTS_TEXT_CHAR_LIMIT, LocalTtsBinding, LocalTtsError, assertTtsModelCardMatchesVoices, createInProcessLocalTtsBackend, createLocalTtsSpeechHarnessFactory, languageVoiceCoverageTable, languagesFromVoices, loadLocalTts, loadTtsVoiceModelCard, loadTtsVoicesManifest, resolveTtsVoice, type CreateLocalTtsSpeechHarnessOptions, type LoadLocalTtsOptions, type LocalTtsNativeBackend, type LocalTtsNativeHandle, type LocalTtsSynthesizeNativeParams, type LocalTtsSynthesizeNativeResult, type LocalTtsTelemetryEvent, type LocalTtsTelemetryOp, type TtsLanguageVoiceCoverageRow, type TtsVoiceCard, type TtsVoiceModelCard, type TtsVoicesManifest, } from "./tts_binding.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gCAAgC,EAChC,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,gCAAgC,EACrC,KAAK,gCAAgC,GACtC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,oCAAoC,EACpC,yBAAyB,EACzB,qBAAqB,EACrB,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,KAAK,oCAAoC,EACzC,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,GAC9B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,GAC/B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,iCAAiC,EACjC,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,0BAA0B,EAC1B,gCAAgC,EAChC,oBAAoB,EACpB,SAAS,EACT,iCAAiC,EACjC,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,+BAA+B,EAC/B,8BAA8B,EAC9B,kCAAkC,EAClC,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,KAAK,kCAAkC,EACvC,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @moolam/bindings-speech — local Indic speech (whisper.cpp-class STT).
|
|
3
|
+
*/
|
|
4
|
+
export { createInProcessWhisperCppBackend, } from "./whisper_ffi.js";
|
|
5
|
+
export { DEFAULT_INDIC_LANGUAGES_MANIFEST, DEFAULT_INDIC_UTTERANCE_CATALOG, INDIC_FIXTURES_DIR, PACKAGE_ROOT, SPEECH_SAMPLE_RATE_HZ, SPEECH_STREAM_CHUNK_LIMIT, WHISPER_CPP_CLASS_ENGINE, WhisperCppSpeechBinding, WhisperCppSpeechError, createWhisperCppSpeechHarnessFactory, indicFixtureAsAudioStream, listIndicUtteranceIds, loadAllIndicUtteranceFixtures, loadIndicLanguagesManifest, loadIndicUtteranceCatalog, loadIndicUtteranceFixture, loadWhisperCppSpeech, } from "./stt_binding.js";
|
|
6
|
+
export { OFFLINE_EDGE_GOLDEN_RELPATH, createEdgeBindingsWithSpeech, proveOfflineEdgeSttBinding, } from "./edge_stt_harness.js";
|
|
7
|
+
export { DEFAULT_SPEECH_CERT_PROFILE, DEFAULT_SPEECH_CERT_REPORT, SPEECH_CERT_OBLIGATION_IDS, SPEECH_CERT_REPORT_SCHEMA_VERSION, SPEECH_PACKAGE_ROOT, loadSpeechCertProfile, parseSpeechCertArgv, proveSpeechCertificationGate, runIndicFixtureGate, runSpeechCertCli, runSpeechCertification, } from "./speech_certification.js";
|
|
8
|
+
export { DEFAULT_VOICE_RTT_BASELINE, DEFAULT_VOICE_RTT_DEVICE_PROFILE, NFR_07_BUDGET_P95_MS, NFR_07_ID, createDelayedFirstAudioTtsBackend, evaluateVoiceRttGates, loadVoiceRttBaseline, loadVoiceRttDeviceProfile, measureOneVoiceRttSample, percentileMs, runVoiceRttProof, } from "./voice_rtt_proof.js";
|
|
9
|
+
export { DEFAULT_TTS_MODEL_CARD, DEFAULT_TTS_VOICES_MANIFEST, LOCAL_TTS_ENGINE, TTS_PACKAGE_ROOT, TTS_SAMPLE_RATE_HZ, TTS_STREAM_CHUNK_LIMIT, TTS_TEXT_CHAR_LIMIT, LocalTtsBinding, LocalTtsError, assertTtsModelCardMatchesVoices, createInProcessLocalTtsBackend, createLocalTtsSpeechHarnessFactory, languageVoiceCoverageTable, languagesFromVoices, loadLocalTts, loadTtsVoiceModelCard, loadTtsVoicesManifest, resolveTtsVoice, } from "./tts_binding.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gCAAgC,GAKjC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,oCAAoC,EACpC,yBAAyB,EACzB,qBAAqB,EACrB,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,GAUrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,GAI3B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,iCAAiC,EACjC,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,GAQvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,0BAA0B,EAC1B,gCAAgC,EAChC,oBAAoB,EACpB,SAAS,EACT,iCAAiC,EACjC,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,gBAAgB,GAMjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,+BAA+B,EAC/B,8BAA8B,EAC9B,kCAAkC,EAClC,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,GAahB,MAAM,kBAAkB,CAAC"}
|