stt and mic capture live tested. capture is now async
This commit is contained in:
parent
83e3c53ebc
commit
68ddc43446
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" project-jdk-name="17" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" project-jdk-name="21" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/out" />
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
|
|
@ -27,6 +27,8 @@ dependencies {
|
||||||
//Java Native Access
|
//Java Native Access
|
||||||
implementation("net.java.dev.jna:jna:5.15.0")
|
implementation("net.java.dev.jna:jna:5.15.0")
|
||||||
implementation("net.java.dev.jna:jna-platform:5.15.0")
|
implementation("net.java.dev.jna:jna-platform:5.15.0")
|
||||||
|
//Coroutines
|
||||||
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,12 @@ import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.window.Window
|
import androidx.compose.ui.window.Window
|
||||||
import androidx.compose.ui.window.application
|
import androidx.compose.ui.window.application
|
||||||
|
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||||
|
import kotlinx.coroutines.GlobalScope
|
||||||
|
import kotlinx.coroutines.async
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
|
||||||
|
@OptIn(DelicateCoroutinesApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
@Preview
|
@Preview
|
||||||
fun App() {
|
fun App() {
|
||||||
|
|
@ -17,7 +22,8 @@ fun App() {
|
||||||
|
|
||||||
MaterialTheme {
|
MaterialTheme {
|
||||||
Button(onClick = {
|
Button(onClick = {
|
||||||
text = "Hello, Desktop!"
|
val mic = Microphone()
|
||||||
|
GlobalScope.async { mic.startCapture() }
|
||||||
}) {
|
}) {
|
||||||
Text(text)
|
Text(text)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
import javax.sound.sampled.AudioFormat
|
import javax.sound.sampled.AudioFormat
|
||||||
import javax.sound.sampled.AudioSystem
|
import javax.sound.sampled.AudioSystem
|
||||||
import javax.sound.sampled.DataLine
|
import javax.sound.sampled.DataLine
|
||||||
import javax.sound.sampled.TargetDataLine
|
import javax.sound.sampled.TargetDataLine
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Documentation
|
* TODO: Documentation
|
||||||
*/
|
*/
|
||||||
|
|
@ -17,9 +20,22 @@ class Microphone {
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
fun startCapture() {
|
suspend fun startCapture() {
|
||||||
|
source.open(audioFormat, source.bufferSize)
|
||||||
source.start()
|
source.start()
|
||||||
//TODO: Start processing loop in new coroutine and check if it could be moved into own file
|
|
||||||
|
val buffer = ByteArray(160000)
|
||||||
|
//TODO: Start loop in own coroutine
|
||||||
|
coroutineScope {
|
||||||
|
launch {
|
||||||
|
while (true) {
|
||||||
|
val audioBytes = source.read(buffer, 0, buffer.size)
|
||||||
|
val stt = STT()
|
||||||
|
val result = stt.parseBuffer(buffer, audioBytes)
|
||||||
|
println("Captured Speech: $result")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -37,12 +53,12 @@ class Microphone {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private fun getFormat(): AudioFormat {
|
private fun getFormat(): AudioFormat {
|
||||||
return AudioFormat( //TODO: Get format settings from user settings
|
return AudioFormat(
|
||||||
16000.0f, // 16000 Required
|
16000.0f, // 16000 Required
|
||||||
16,
|
16,
|
||||||
2,
|
1,
|
||||||
true,
|
true,
|
||||||
true
|
false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
@ -53,9 +69,7 @@ class Microphone {
|
||||||
TargetDataLine::class.java,
|
TargetDataLine::class.java,
|
||||||
audioFormat
|
audioFormat
|
||||||
)
|
)
|
||||||
val source = AudioSystem.getLine(info) as TargetDataLine
|
|
||||||
source.open(audioFormat)
|
|
||||||
|
|
||||||
return source
|
return AudioSystem.getLine(info) as TargetDataLine
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue