1+ import {
2+ createSpeakerEmbeddingExtractor,
3+ createSpeakerEmbeddingManager,
4+ speakerEmbeddingExtractorComputeEmbedding,
5+ speakerEmbeddingExtractorCreateStream,
6+ speakerEmbeddingExtractorDim,
7+ speakerEmbeddingExtractorIsReady,
8+ speakerEmbeddingManagerAdd,
9+ speakerEmbeddingManagerAddListFlattened,
10+ speakerEmbeddingManagerContains,
11+ speakerEmbeddingManagerGetAllSpeakers,
12+ speakerEmbeddingManagerNumSpeakers,
13+ speakerEmbeddingManagerRemove,
14+ speakerEmbeddingManagerSearch,
15+ speakerEmbeddingManagerVerify
16+ } from 'libsherpa_onnx.so';
17+ import { OnlineStream } from './StreamingAsr';
18+
19+ export class SpeakerEmbeddingExtractorConfig {
20+ public model: string = '';
21+ public numThreads: number = 1;
22+ public debug: boolean = false;
23+ public provider: string = 'cpu';
24+ }
25+
26+ export class SpeakerEmbeddingExtractor {
27+ public config: SpeakerEmbeddingExtractorConfig = new SpeakerEmbeddingExtractorConfig();
28+ public dim: number;
29+ private handle: object;
30+
31+ constructor(config: SpeakerEmbeddingExtractorConfig, mgr?: object) {
32+ this.handle = createSpeakerEmbeddingExtractor(config, mgr);
33+ this.config = config;
34+ this.dim = speakerEmbeddingExtractorDim(this.handle);
35+ }
36+
37+ createStream(): OnlineStream {
38+ return new OnlineStream(
39+ speakerEmbeddingExtractorCreateStream(this.handle));
40+ }
41+
42+ isReady(stream: OnlineStream): boolean {
43+ return speakerEmbeddingExtractorIsReady(this.handle, stream.handle);
44+ }
45+
46+ compute(stream: OnlineStream, enableExternalBuffer: boolean = true): Float32Array {
47+ return speakerEmbeddingExtractorComputeEmbedding(
48+ this.handle, stream.handle, enableExternalBuffer);
49+ }
50+ }
51+
52+ function flatten(arrayList: Float32Array[]): Float32Array {
53+ let n = 0;
54+ for (let i = 0; i < arrayList.length; ++i) {
55+ n += arrayList[i].length;
56+ }
57+ let ans = new Float32Array(n);
58+
59+ let offset = 0;
60+ for (let i = 0; i < arrayList.length; ++i) {
61+ ans.set(arrayList[i], offset);
62+ offset += arrayList[i].length;
63+ }
64+ return ans;
65+ }
66+
67+ interface SpeakerNameWithEmbedding {
68+ name: string;
69+ v: Float32Array;
70+ }
71+
72+ interface SpeakerNameWithEmbeddingList {
73+ name: string;
74+ v: Float32Array[];
75+ }
76+
77+ interface SpeakerNameWithEmbeddingN {
78+ name: string;
79+ vv: Float32Array;
80+ n: number;
81+ }
82+
83+ interface EmbeddingWithThreshold {
84+ v: Float32Array;
85+ threshold: number;
86+ }
87+
88+ interface SpeakerNameEmbeddingThreshold {
89+ name: string;
90+ v: Float32Array;
91+ threshold: number;
92+ }
93+
94+ export class SpeakerEmbeddingManager {
95+ public dim: number;
96+ private handle: object;
97+
98+ constructor(dim: number) {
99+ this.handle = createSpeakerEmbeddingManager(dim);
100+ this.dim = dim;
101+ }
102+
103+ add(speaker: SpeakerNameWithEmbedding): boolean {
104+ return speakerEmbeddingManagerAdd(this.handle, speaker);
105+ }
106+
107+ addMulti(speaker: SpeakerNameWithEmbeddingList): boolean {
108+ const c: SpeakerNameWithEmbeddingN = {
109+ name: speaker.name,
110+ vv: flatten(speaker.v),
111+ n: speaker.v.length,
112+ };
113+ return speakerEmbeddingManagerAddListFlattened(this.handle, c);
114+ }
115+
116+ remove(name: string): boolean {
117+ return speakerEmbeddingManagerRemove(this.handle, name);
118+ }
119+
120+ search(obj: EmbeddingWithThreshold): string {
121+ return speakerEmbeddingManagerSearch(this.handle, obj);
122+ }
123+
124+ verify(obj: SpeakerNameEmbeddingThreshold): boolean {
125+ return speakerEmbeddingManagerVerify(this.handle, obj);
126+ }
127+
128+ contains(name: string): boolean {
129+ return speakerEmbeddingManagerContains(this.handle, name);
130+ }
131+
132+ getNumSpeakers(): number {
133+ return speakerEmbeddingManagerNumSpeakers(this.handle);
134+ }
135+
136+ getAllSpeakerNames(): string[] {
137+ return speakerEmbeddingManagerGetAllSpeakers(this.handle);
138+ }
139+ }
0 commit comments