You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.8 KiB
62 lines
1.8 KiB
package com.whispercppdemo.whisper
|
|
|
|
import kotlinx.coroutines.*
|
|
import java.util.concurrent.Executors
|
|
|
|
class WhisperContext private constructor(private var ptr: Long) {
|
|
// Meet Whisper C++ constraint: Don't access from more than one thread at a time.
|
|
private val scope: CoroutineScope = CoroutineScope(
|
|
Executors.newSingleThreadExecutor().asCoroutineDispatcher()
|
|
)
|
|
|
|
suspend fun transcribeData(data: FloatArray): String = withContext(scope.coroutineContext) {
|
|
require(ptr != 0L)
|
|
WhisperLib.fullTranscribe(ptr, data)
|
|
val textCount = WhisperLib.getTextSegmentCount(ptr)
|
|
return@withContext buildString {
|
|
for (i in 0 until textCount) {
|
|
append(WhisperLib.getTextSegment(ptr, i))
|
|
}
|
|
}
|
|
}
|
|
|
|
suspend fun release() = withContext(scope.coroutineContext) {
|
|
if (ptr != 0L) {
|
|
WhisperLib.freeContext(ptr)
|
|
ptr = 0
|
|
}
|
|
}
|
|
|
|
protected fun finalize() {
|
|
runBlocking {
|
|
release()
|
|
}
|
|
}
|
|
|
|
companion object {
|
|
fun createContext(filePath: String): WhisperContext {
|
|
val ptr = WhisperLib.initContext(filePath)
|
|
if (ptr == 0L) {
|
|
throw java.lang.RuntimeException("Couldn't create context with path $filePath")
|
|
}
|
|
return WhisperContext(ptr)
|
|
}
|
|
}
|
|
}
|
|
|
|
private class WhisperLib {
|
|
companion object {
|
|
init {
|
|
System.loadLibrary("whisper")
|
|
}
|
|
|
|
// JNI methods
|
|
external fun initContext(modelPath: String): Long
|
|
external fun freeContext(contextPtr: Long)
|
|
external fun fullTranscribe(contextPtr: Long, audioData: FloatArray)
|
|
external fun getTextSegmentCount(contextPtr: Long): Int
|
|
external fun getTextSegment(contextPtr: Long, index: Int): String
|
|
}
|
|
}
|
|
|