WebAssembly exmaple for speaker diarization (#1411)
This commit is contained in:
@@ -16,6 +16,11 @@ namespace SherpaOnnx
|
||||
_handle = new HandleRef(this, h);
|
||||
}
|
||||
|
||||
public void SetConfig(OfflineSpeakerDiarizationConfig config)
|
||||
{
|
||||
SherpaOnnxOfflineSpeakerDiarizationSetConfig(_handle.Handle, ref config);
|
||||
}
|
||||
|
||||
public OfflineSpeakerDiarizationSegment[] Process(float[] samples)
|
||||
{
|
||||
IntPtr result = SherpaOnnxOfflineSpeakerDiarizationProcess(_handle.Handle, samples, samples.Length);
|
||||
@@ -117,6 +122,9 @@ namespace SherpaOnnx
|
||||
|
||||
[DllImport(Dll.Filename)]
|
||||
private static extern void SherpaOnnxOfflineSpeakerDiarizationDestroySegment(IntPtr handle);
|
||||
|
||||
[DllImport(Dll.Filename)]
|
||||
private static extern void SherpaOnnxOfflineSpeakerDiarizationSetConfig(IntPtr handle, ref OfflineSpeakerDiarizationConfig config);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1276,6 +1276,16 @@ func (sd *OfflineSpeakerDiarization) SampleRate() int {
|
||||
return int(C.SherpaOnnxOfflineSpeakerDiarizationGetSampleRate(sd.impl))
|
||||
}
|
||||
|
||||
// only config.Clustering is used. All other fields are ignored
|
||||
func (sd *OfflineSpeakerDiarization) SetConfig(config *OfflineSpeakerDiarizationConfig) {
|
||||
c := C.struct_SherpaOnnxOfflineSpeakerDiarizationConfig{}
|
||||
|
||||
c.clustering.num_clusters = C.int(config.Clustering.NumClusters)
|
||||
c.clustering.threshold = C.float(config.Clustering.Threshold)
|
||||
|
||||
SherpaOnnxOfflineSpeakerDiarizationSetConfig(sd.impl, &c)
|
||||
}
|
||||
|
||||
type OfflineSpeakerDiarizationSegment struct {
|
||||
Start float32
|
||||
End float32
|
||||
|
||||
@@ -25,6 +25,11 @@ class OfflineSpeakerDiarization {
|
||||
process(samples) {
|
||||
return addon.offlineSpeakerDiarizationProcess(this.handle, samples);
|
||||
}
|
||||
|
||||
setConfig(config) {
|
||||
addon.offlineSpeakerDiarizationSetConfig(config);
|
||||
this.config.clustering = config.clustering;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
||||
@@ -251,6 +251,46 @@ static Napi::Array OfflineSpeakerDiarizationProcessWrapper(
|
||||
return ans;
|
||||
}
|
||||
|
||||
static void OfflineSpeakerDiarizationSetConfigWrapper(
|
||||
const Napi::CallbackInfo &info) {
|
||||
Napi::Env env = info.Env();
|
||||
|
||||
if (info.Length() != 2) {
|
||||
std::ostringstream os;
|
||||
os << "Expect only 2 arguments. Given: " << info.Length();
|
||||
|
||||
Napi::TypeError::New(env, os.str()).ThrowAsJavaScriptException();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!info[0].IsExternal()) {
|
||||
Napi::TypeError::New(
|
||||
env, "Argument 0 should be an offline speaker diarization pointer.")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const SherpaOnnxOfflineSpeakerDiarization *sd =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineSpeakerDiarization>>().Data();
|
||||
|
||||
if (!info[1].IsObject()) {
|
||||
Napi::TypeError::New(env, "Expect an object as the argument")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Napi::Object o = info[0].As<Napi::Object>();
|
||||
|
||||
SherpaOnnxOfflineSpeakerDiarizationConfig c;
|
||||
memset(&c, 0, sizeof(c));
|
||||
|
||||
c.clustering = GetFastClusteringConfig(o);
|
||||
SherpaOnnxOfflineSpeakerDiarizationSetConfig(sd, &c);
|
||||
}
|
||||
|
||||
void InitNonStreamingSpeakerDiarization(Napi::Env env, Napi::Object exports) {
|
||||
exports.Set(Napi::String::New(env, "createOfflineSpeakerDiarization"),
|
||||
Napi::Function::New(env, CreateOfflineSpeakerDiarizationWrapper));
|
||||
@@ -262,4 +302,8 @@ void InitNonStreamingSpeakerDiarization(Napi::Env env, Napi::Object exports) {
|
||||
exports.Set(
|
||||
Napi::String::New(env, "offlineSpeakerDiarizationProcess"),
|
||||
Napi::Function::New(env, OfflineSpeakerDiarizationProcessWrapper));
|
||||
|
||||
exports.Set(
|
||||
Napi::String::New(env, "offlineSpeakerDiarizationSetConfig"),
|
||||
Napi::Function::New(env, OfflineSpeakerDiarizationSetConfigWrapper));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user