speaker-identification.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /** @typedef {import('./types').SpeakerEmbeddingEntry} SpeakerEmbeddingEntry */
  2. /** @typedef {import('./types').SpeakerEmbeddingManagerSearchObj} SpeakerEmbeddingManagerSearchObj */
  3. /** @typedef {import('./types').SpeakerEmbeddingManagerVerifyObj} SpeakerEmbeddingManagerVerifyObj */
  4. /** @typedef {import('./types').SpeakerEmbeddingExtractorConfig} SpeakerEmbeddingExtractorConfig */
  5. /** @typedef {import('./types').SpeakerEmbeddingExtractorHandle} SpeakerEmbeddingExtractorHandle */
  6. /** @typedef {import('./types').SpeakerEmbeddingManagerHandle} SpeakerEmbeddingManagerHandle */
  7. /** @typedef {import('./streaming-asr').OnlineStream} OnlineStream */
  8. const addon = require('./addon.js');
  9. const streaming_asr = require('./streaming-asr.js');
  10. /**
  11. * SpeakerEmbeddingExtractor wraps native speaker embedding extractor.
  12. */
  13. class SpeakerEmbeddingExtractor {
  14. /**
  15. * @param {SpeakerEmbeddingExtractorConfig} config
  16. */
  17. constructor(config) {
  18. this.handle = addon.createSpeakerEmbeddingExtractor(config);
  19. this.config = config;
  20. this.dim = addon.speakerEmbeddingExtractorDim(this.handle);
  21. }
  22. /**
  23. * @returns {OnlineStream}
  24. */
  25. createStream() {
  26. return new streaming_asr.OnlineStream(
  27. addon.speakerEmbeddingExtractorCreateStream(this.handle));
  28. }
  29. /**
  30. * @param {OnlineStream} stream
  31. * @returns {boolean}
  32. */
  33. isReady(stream) {
  34. return addon.speakerEmbeddingExtractorIsReady(this.handle, stream.handle);
  35. }
  36. /**
  37. * Compute embedding and return a Float32Array
  38. * @param {OnlineStream} stream
  39. * @param {boolean} [enableExternalBuffer=true]
  40. * @returns {Float32Array}
  41. */
  42. compute(stream, enableExternalBuffer = true) {
  43. return addon.speakerEmbeddingExtractorComputeEmbedding(
  44. this.handle, stream.handle, enableExternalBuffer);
  45. }
  46. }
  47. /**
  48. * Flattens an array of Float32Arrays into a single Float32Array.
  49. * @param {Float32Array[]} arrayList
  50. * @returns {Float32Array}
  51. */
  52. function flatten(arrayList) {
  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. let offset = 0;
  59. for (let i = 0; i < arrayList.length; ++i) {
  60. ans.set(arrayList[i], offset);
  61. offset += arrayList[i].length;
  62. }
  63. return ans;
  64. }
  65. /**
  66. * Manager for speaker embeddings.
  67. */
  68. class SpeakerEmbeddingManager {
  69. /**
  70. * @param {number} dim - The embedding dimension
  71. */
  72. constructor(dim) {
  73. this.handle = addon.createSpeakerEmbeddingManager(dim);
  74. this.dim = dim;
  75. }
  76. /**
  77. * @param {SpeakerEmbeddingEntry} obj
  78. * @returns {boolean}
  79. */
  80. add(obj) {
  81. return addon.speakerEmbeddingManagerAdd(this.handle, obj);
  82. }
  83. /**
  84. * @param {{name:string, v: Float32Array[]}} obj
  85. * @returns {boolean}
  86. */
  87. addMulti(obj) {
  88. const c = {
  89. name: obj.name,
  90. vv: flatten(obj.v),
  91. n: obj.v.length,
  92. };
  93. return addon.speakerEmbeddingManagerAddListFlattened(this.handle, c);
  94. }
  95. /**
  96. * @param {string} name
  97. * @returns {boolean}
  98. */
  99. remove(name) {
  100. return addon.speakerEmbeddingManagerRemove(this.handle, name);
  101. }
  102. /**
  103. * @param {SpeakerEmbeddingManagerSearchObj} obj
  104. * @returns {string}
  105. */
  106. search(obj) {
  107. return addon.speakerEmbeddingManagerSearch(this.handle, obj);
  108. }
  109. /**
  110. * @param {SpeakerEmbeddingManagerVerifyObj} obj
  111. * @returns {boolean}
  112. */
  113. verify(obj) {
  114. return addon.speakerEmbeddingManagerVerify(this.handle, obj);
  115. }
  116. /**
  117. * @param {string} name
  118. * @returns {boolean}
  119. */
  120. contains(name) {
  121. return addon.speakerEmbeddingManagerContains(this.handle, name);
  122. }
  123. /** @returns {number} */
  124. getNumSpeakers() {
  125. return addon.speakerEmbeddingManagerNumSpeakers(this.handle);
  126. }
  127. /** @returns {string[]} */
  128. getAllSpeakerNames() {
  129. return addon.speakerEmbeddingManagerGetAllSpeakers(this.handle);
  130. }
  131. }
  132. module.exports = {
  133. SpeakerEmbeddingExtractor,
  134. SpeakerEmbeddingManager,
  135. }