Phase 2: Core transcription pipeline and audio playback
- Implement faster-whisper TranscribeService with word-level timestamps, progress reporting, and hardware auto-detection - Wire up Rust SidecarManager for Python process lifecycle (spawn, IPC, shutdown) - Add transcribe_file Tauri command bridging frontend to Python sidecar - Integrate wavesurfer.js WaveformPlayer with play/pause, skip, seek controls - Build TranscriptEditor with word-level click-to-seek and active highlighting - Connect file import flow: prompt → asset load → transcribe → display - Add typed tauri-bridge service with TranscriptionResult interface - Add Python tests for hardware detection and transcription result formatting Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,2 +1,52 @@
|
||||
// Transcription commands — start/stop/monitor transcription via Python sidecar
|
||||
// TODO: Implement when sidecar IPC is connected
|
||||
use serde_json::{json, Value};
|
||||
|
||||
use crate::sidecar::messages::IPCMessage;
|
||||
use crate::sidecar::SidecarManager;
|
||||
|
||||
/// Start transcription of an audio file via the Python sidecar.
|
||||
///
|
||||
/// This is a blocking command — it starts the sidecar if needed,
|
||||
/// sends the transcribe request, and waits for the result.
|
||||
#[tauri::command]
|
||||
pub fn transcribe_file(
|
||||
file_path: String,
|
||||
model: Option<String>,
|
||||
device: Option<String>,
|
||||
language: Option<String>,
|
||||
) -> Result<Value, String> {
|
||||
// Determine Python sidecar path (relative to app)
|
||||
let python_path = std::env::current_dir()
|
||||
.map_err(|e| e.to_string())?
|
||||
.join("../python")
|
||||
.canonicalize()
|
||||
.map_err(|e| format!("Cannot find python directory: {e}"))?;
|
||||
|
||||
let python_path_str = python_path.to_string_lossy().to_string();
|
||||
|
||||
let manager = SidecarManager::new();
|
||||
manager.start(&python_path_str)?;
|
||||
|
||||
let request_id = uuid::Uuid::new_v4().to_string();
|
||||
let msg = IPCMessage::new(
|
||||
&request_id,
|
||||
"transcribe.start",
|
||||
json!({
|
||||
"file": file_path,
|
||||
"model": model.unwrap_or_else(|| "base".to_string()),
|
||||
"device": device.unwrap_or_else(|| "cpu".to_string()),
|
||||
"compute_type": "int8",
|
||||
"language": language,
|
||||
}),
|
||||
);
|
||||
|
||||
let response = manager.send_and_receive(&msg)?;
|
||||
|
||||
if response.msg_type == "error" {
|
||||
return Err(format!(
|
||||
"Transcription error: {}",
|
||||
response.payload.get("message").and_then(|v| v.as_str()).unwrap_or("unknown")
|
||||
));
|
||||
}
|
||||
|
||||
Ok(response.payload)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user