use anyhow::Result;
use std::io::{self, Write};
use whis_core::{
AudioRecorder, RecordingOutput, copy_to_clipboard, parallel_transcribe,
transcribe_audio,
};
use crate::app;
pub fn run() -> Result<()> {
let runtime = tokio::runtime::Runtime::new()?;
app::ensure_ffmpeg_installed()?;
let config = app::load_api_config()?;
let mut recorder = AudioRecorder::new()?;
recorder.start_recording()?;
print!("Recording... (press Enter to stop)");
io::stdout().flush()?;
app::wait_for_enter()?;
let audio_result = recorder.finalize_recording()?;
let transcription = match audio_result {
RecordingOutput::Single(audio_data) => {
print!("\rTranscribing... \n");
io::stdout().flush()?;
match transcribe_audio(&config.openai_api_key, audio_data) {
Ok(text) => text,
Err(e) => {
eprintln!("Transcription error: {e}");
std::process::exit(1);
}
}
}
RecordingOutput::Chunked(chunks) => {
print!("\rTranscribing... \n");
io::stdout().flush()?;
runtime.block_on(async {
match parallel_transcribe(&config.openai_api_key, chunks, None).await {
Ok(text) => text,
Err(e) => {
eprintln!("Transcription error: {e}");
std::process::exit(1);
}
}
})
}
};
copy_to_clipboard(&transcription)?;
println!("Copied to clipboard");
Ok(())
}