mirror of
https://github.com/twinksoftware/Gearslip.git
synced 2026-11-11 00:12:24 +01:00
Models download in Settings instead of shipping in the APK. Credits for the engine and models are in About.
159 lines
4.7 KiB
Kotlin
159 lines
4.7 KiB
Kotlin
// From sherpa-onnx v1.13.8 (Apache-2.0, https://github.com/k2-fsa/sherpa-onnx), kotlin-api.
|
|
// The JNI names are fixed to this package; the upstream catalog of pretrained models is left out.
|
|
package com.k2fsa.sherpa.onnx
|
|
|
|
import android.content.res.AssetManager
|
|
|
|
data class EndpointRule(
|
|
var mustContainNonSilence: Boolean,
|
|
var minTrailingSilence: Float,
|
|
var minUtteranceLength: Float,
|
|
)
|
|
|
|
data class EndpointConfig(
|
|
var rule1: EndpointRule = EndpointRule(false, 2.4f, 0.0f),
|
|
var rule2: EndpointRule = EndpointRule(true, 1.4f, 0.0f),
|
|
var rule3: EndpointRule = EndpointRule(false, 0.0f, 20.0f)
|
|
)
|
|
|
|
data class OnlineTransducerModelConfig(
|
|
var encoder: String = "",
|
|
var decoder: String = "",
|
|
var joiner: String = "",
|
|
var qnnConfig: QnnConfig = QnnConfig(),
|
|
)
|
|
|
|
data class OnlineParaformerModelConfig(
|
|
var encoder: String = "",
|
|
var decoder: String = "",
|
|
)
|
|
|
|
data class OnlineZipformer2CtcModelConfig(
|
|
var model: String = "",
|
|
)
|
|
|
|
data class OnlineNeMoCtcModelConfig(
|
|
var model: String = "",
|
|
)
|
|
|
|
data class OnlineToneCtcModelConfig(
|
|
var model: String = "",
|
|
)
|
|
|
|
data class OnlineModelConfig(
|
|
var transducer: OnlineTransducerModelConfig = OnlineTransducerModelConfig(),
|
|
var paraformer: OnlineParaformerModelConfig = OnlineParaformerModelConfig(),
|
|
var zipformer2Ctc: OnlineZipformer2CtcModelConfig = OnlineZipformer2CtcModelConfig(),
|
|
var neMoCtc: OnlineNeMoCtcModelConfig = OnlineNeMoCtcModelConfig(),
|
|
var toneCtc: OnlineToneCtcModelConfig = OnlineToneCtcModelConfig(),
|
|
var tokens: String = "",
|
|
var numThreads: Int = 1,
|
|
var debug: Boolean = false,
|
|
var provider: String = "cpu",
|
|
var modelType: String = "",
|
|
var modelingUnit: String = "",
|
|
var bpeVocab: String = "",
|
|
)
|
|
|
|
data class OnlineLMConfig(
|
|
var model: String = "",
|
|
var scale: Float = 0.5f,
|
|
)
|
|
|
|
data class OnlineCtcFstDecoderConfig(
|
|
var graph: String = "",
|
|
var maxActive: Int = 3000,
|
|
)
|
|
|
|
data class OnlineRecognizerConfig(
|
|
var featConfig: FeatureConfig = FeatureConfig(),
|
|
var modelConfig: OnlineModelConfig = OnlineModelConfig(),
|
|
var lmConfig: OnlineLMConfig = OnlineLMConfig(),
|
|
var ctcFstDecoderConfig: OnlineCtcFstDecoderConfig = OnlineCtcFstDecoderConfig(),
|
|
var hr: HomophoneReplacerConfig = HomophoneReplacerConfig(),
|
|
var endpointConfig: EndpointConfig = EndpointConfig(),
|
|
var enableEndpoint: Boolean = true,
|
|
var decodingMethod: String = "greedy_search",
|
|
var maxActivePaths: Int = 4,
|
|
var hotwordsFile: String = "",
|
|
var hotwordsScore: Float = 1.5f,
|
|
var ruleFsts: String = "",
|
|
var ruleFars: String = "",
|
|
var blankPenalty: Float = 0.0f,
|
|
)
|
|
|
|
data class OnlineRecognizerResult(
|
|
val text: String,
|
|
val tokens: Array<String>,
|
|
val timestamps: FloatArray,
|
|
val ysProbs: FloatArray,
|
|
// TODO(fangjun): Add more fields
|
|
)
|
|
|
|
class OnlineRecognizer(
|
|
assetManager: AssetManager? = null,
|
|
val config: OnlineRecognizerConfig,
|
|
) {
|
|
private var ptr: Long
|
|
|
|
init {
|
|
ptr = if (assetManager != null) {
|
|
newFromAsset(assetManager, config)
|
|
} else {
|
|
newFromFile(config)
|
|
}
|
|
require(ptr != 0L) {
|
|
"Invalid OnlineRecognizerConfig: failed to create native OnlineRecognizer"
|
|
}
|
|
}
|
|
|
|
protected fun finalize() {
|
|
if (ptr != 0L) {
|
|
delete(ptr)
|
|
ptr = 0
|
|
}
|
|
}
|
|
|
|
fun release() = finalize()
|
|
|
|
fun createStream(hotwords: String = ""): OnlineStream {
|
|
val p = createStream(ptr, hotwords)
|
|
return OnlineStream(p)
|
|
}
|
|
|
|
fun reset(stream: OnlineStream) = reset(ptr, stream.ptr)
|
|
fun decode(stream: OnlineStream) = decode(ptr, stream.ptr)
|
|
fun isEndpoint(stream: OnlineStream) = isEndpoint(ptr, stream.ptr)
|
|
fun isReady(stream: OnlineStream) = isReady(ptr, stream.ptr)
|
|
fun getResult(stream: OnlineStream): OnlineRecognizerResult {
|
|
return getResult(ptr, stream.ptr)
|
|
}
|
|
|
|
private external fun delete(ptr: Long)
|
|
|
|
private external fun newFromAsset(
|
|
assetManager: AssetManager,
|
|
config: OnlineRecognizerConfig,
|
|
): Long
|
|
|
|
private external fun newFromFile(
|
|
config: OnlineRecognizerConfig,
|
|
): Long
|
|
|
|
private external fun createStream(ptr: Long, hotwords: String): Long
|
|
private external fun reset(ptr: Long, streamPtr: Long)
|
|
private external fun decode(ptr: Long, streamPtr: Long)
|
|
private external fun isEndpoint(ptr: Long, streamPtr: Long): Boolean
|
|
private external fun isReady(ptr: Long, streamPtr: Long): Boolean
|
|
private external fun getResult(ptr: Long, streamPtr: Long): OnlineRecognizerResult
|
|
|
|
companion object {
|
|
init {
|
|
System.loadLibrary("sherpa-onnx-jni")
|
|
}
|
|
|
|
@JvmStatic
|
|
external fun prependAdspLibraryPath(newPath: String) // for qnn
|
|
}
|
|
}
|