Add JavaScript API (WebAssembly) for FireRedAsr model. (#1874)

This commit is contained in:
Fangjun Kuang
2025-02-17 12:54:18 +08:00
committed by GitHub
parent 050df2a357
commit 7ad44bc43a
6 changed files with 112 additions and 4 deletions

View File

@@ -35,6 +35,10 @@ function freeConfig(config, Module) {
freeConfig(config.whisper, Module)
}
if ('fireRedAsr' in config) {
freeConfig(config.fireRedAsr, Module)
}
if ('moonshine' in config) {
freeConfig(config.moonshine, Module)
}
@@ -651,6 +655,35 @@ function initSherpaOnnxOfflineMoonshineModelConfig(config, Module) {
}
}
function initSherpaOnnxOfflineFireRedAsrModelConfig(config, Module) {
const encoderLen = Module.lengthBytesUTF8(config.encoder || '') + 1;
const decoderLen = Module.lengthBytesUTF8(config.decoder || '') + 1;
const n = encoderLen + decoderLen;
const buffer = Module._malloc(n);
const len = 2 * 4; // 2 pointers
const ptr = Module._malloc(len);
let offset = 0;
Module.stringToUTF8(config.encoder || '', buffer + offset, encoderLen);
offset += encoderLen;
Module.stringToUTF8(config.decoder || '', buffer + offset, decoderLen);
offset += decoderLen;
offset = 0;
Module.setValue(ptr, buffer + offset, 'i8*');
offset += encoderLen;
Module.setValue(ptr + 4, buffer + offset, 'i8*');
offset += decoderLen;
return {
buffer: buffer, ptr: ptr, len: len,
}
}
function initSherpaOnnxOfflineTdnnModelConfig(config, Module) {
const n = Module.lengthBytesUTF8(config.model || '') + 1;
const buffer = Module._malloc(n);
@@ -755,6 +788,13 @@ function initSherpaOnnxOfflineModelConfig(config, Module) {
};
}
if (!('fireRedAsr' in config)) {
config.fireRedAsr = {
encoder: '',
decoder: '',
};
}
if (!('tdnn' in config)) {
config.tdnn = {
model: '',
@@ -789,8 +829,11 @@ function initSherpaOnnxOfflineModelConfig(config, Module) {
const moonshine =
initSherpaOnnxOfflineMoonshineModelConfig(config.moonshine, Module);
const fireRedAsr =
initSherpaOnnxOfflineFireRedAsrModelConfig(config.fireRedAsr, Module);
const len = transducer.len + paraformer.len + nemoCtc.len + whisper.len +
tdnn.len + 8 * 4 + senseVoice.len + moonshine.len;
tdnn.len + 8 * 4 + senseVoice.len + moonshine.len + fireRedAsr.len;
const ptr = Module._malloc(len);
@@ -884,11 +927,15 @@ function initSherpaOnnxOfflineModelConfig(config, Module) {
offset += senseVoice.len;
Module._CopyHeap(moonshine.ptr, moonshine.len, ptr + offset);
offset += moonshine.len;
Module._CopyHeap(fireRedAsr.ptr, fireRedAsr.len, ptr + offset);
offset += fireRedAsr.len;
return {
buffer: buffer, ptr: ptr, len: len, transducer: transducer,
paraformer: paraformer, nemoCtc: nemoCtc, whisper: whisper, tdnn: tdnn,
senseVoice: senseVoice, moonshine: moonshine,
senseVoice: senseVoice, moonshine: moonshine, fireRedAsr: fireRedAsr
}
}

View File

@@ -15,6 +15,7 @@ static_assert(sizeof(SherpaOnnxOfflineParaformerModelConfig) == 4, "");
static_assert(sizeof(SherpaOnnxOfflineNemoEncDecCtcModelConfig) == 4, "");
static_assert(sizeof(SherpaOnnxOfflineWhisperModelConfig) == 5 * 4, "");
static_assert(sizeof(SherpaOnnxOfflineFireRedAsrModelConfig) == 2 * 4, "");
static_assert(sizeof(SherpaOnnxOfflineMoonshineModelConfig) == 4 * 4, "");
static_assert(sizeof(SherpaOnnxOfflineTdnnModelConfig) == 4, "");
static_assert(sizeof(SherpaOnnxOfflineSenseVoiceModelConfig) == 3 * 4, "");
@@ -27,7 +28,9 @@ static_assert(sizeof(SherpaOnnxOfflineModelConfig) ==
sizeof(SherpaOnnxOfflineWhisperModelConfig) +
sizeof(SherpaOnnxOfflineTdnnModelConfig) + 8 * 4 +
sizeof(SherpaOnnxOfflineSenseVoiceModelConfig) +
sizeof(SherpaOnnxOfflineMoonshineModelConfig),
sizeof(SherpaOnnxOfflineMoonshineModelConfig) +
sizeof(SherpaOnnxOfflineFireRedAsrModelConfig),
"");
static_assert(sizeof(SherpaOnnxFeatureConfig) == 2 * 4, "");
static_assert(sizeof(SherpaOnnxOfflineRecognizerConfig) ==
@@ -69,6 +72,7 @@ void PrintOfflineRecognizerConfig(SherpaOnnxOfflineRecognizerConfig *config) {
auto tdnn = &model_config->tdnn;
auto sense_voice = &model_config->sense_voice;
auto moonshine = &model_config->moonshine;
auto fire_red_asr = &model_config->fire_red_asr;
fprintf(stdout, "----------offline transducer model config----------\n");
fprintf(stdout, "encoder: %s\n", transducer->encoder);
@@ -102,6 +106,10 @@ void PrintOfflineRecognizerConfig(SherpaOnnxOfflineRecognizerConfig *config) {
fprintf(stdout, "uncached_decoder: %s\n", moonshine->uncached_decoder);
fprintf(stdout, "cached_decoder: %s\n", moonshine->cached_decoder);
fprintf(stdout, "----------offline FireRedAsr model config----------\n");
fprintf(stdout, "encoder: %s\n", fire_red_asr->encoder);
fprintf(stdout, "decoder: %s\n", fire_red_asr->decoder);
fprintf(stdout, "tokens: %s\n", model_config->tokens);
fprintf(stdout, "num_threads: %d\n", model_config->num_threads);
fprintf(stdout, "provider: %s\n", model_config->provider);