OnlineStream.java 2.3 KB
/*
 * // Copyright 2022-2023 by zhaoming
 */
// Stream is used for feeding data to the asr engine
package com.k2fsa.sherpa.onnx;

import java.io.*;
import java.util.*;

public class OnlineStream {
  private long ptr = 0; // this is the  stream ptr

  private int sampleRate = 16000;
  // assign ptr to this stream in construction
  public OnlineStream(long ptr, int sampleRate) {
    this.ptr = ptr;
    this.sampleRate = sampleRate;
  }

  public long getPtr() {
    return ptr;
  }

  public void acceptWaveform(float[] samples) throws Exception {
    if (this.ptr == 0) throw new Exception("null exception for stream ptr");

    // feed wave data to asr engine
    acceptWaveform(this.ptr, this.sampleRate, samples);
  }

  public void inputFinished() {
    // add some tail padding
    int padLen = (int) (this.sampleRate * 0.3); // 0.3 seconds at 16 kHz sample rate
    float tailPaddings[] = new float[padLen]; // default value is 0
    acceptWaveform(this.ptr, this.sampleRate, tailPaddings);

    // tell the engine all data are feeded
    inputFinished(this.ptr);
  }

  public static void loadSoLib(String soPath) {
    // load .so lib from the path
    System.load(soPath.trim()); // ("sherpa-onnx-jni-java");
  }

  public void release() {
    // stream object must be release after used
    if (this.ptr == 0) return;
    deleteStream(this.ptr);
    this.ptr = 0;
  }

  protected void finalize() throws Throwable {
    release();
  }

  public boolean isLastFrame() throws Exception {
    if (this.ptr == 0) throw new Exception("null exception for stream ptr");
    return isLastFrame(this.ptr);
  }

  public void reSet() throws Exception {
    if (this.ptr == 0) throw new Exception("null exception for stream ptr");
    reSet(this.ptr);
  }

  public int featureDim() throws Exception {
    if (this.ptr == 0) throw new Exception("null exception for stream ptr");
    return featureDim(this.ptr);
  }

  // JNI interface libsherpa-onnx-jni.so
  private native void acceptWaveform(long ptr, int sampleRate, float[] samples);

  private native void inputFinished(long ptr);

  private native void deleteStream(long ptr);

  private native int numFramesReady(long ptr);

  private native boolean isLastFrame(long ptr);

  private native void reSet(long ptr);

  private native int featureDim(long ptr);
}