Skip to content

Commit 87b957d

Browse files
committed
chore: lint
1 parent 24bfbef commit 87b957d

File tree

2 files changed

+35
-29
lines changed

2 files changed

+35
-29
lines changed

apps/silero-vad-whisper-realtime-api/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct AppState {
3333
}
3434

3535
impl AppState {
36+
#[allow(clippy::unused_async)]
3637
async fn new() -> Result<Self> {
3738
// Determine device to use
3839
let device = if std::env::var("CANDLE_FORCE_CPU").is_ok() {

apps/silero-vad-whisper-realtime-api/src/router.rs

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use symphonia::{
2121
audio::{AudioBufferRef, Signal},
2222
codecs::DecoderOptions,
2323
formats::FormatOptions,
24-
io::MediaSourceStream,
24+
io::{MediaSourceStream, MediaSourceStreamOptions},
2525
meta::MetadataOptions,
2626
probe::Hint,
2727
},
@@ -46,7 +46,7 @@ struct ProcessingStats {
4646
}
4747

4848
impl ProcessingStats {
49-
fn new() -> Self {
49+
const fn new() -> Self {
5050
Self {
5151
total_duration: Duration::ZERO,
5252
audio_conversion_duration: Duration::ZERO,
@@ -66,7 +66,7 @@ impl ProcessingStats {
6666
println!(" ⏱️ Total processing: {:.2}ms", self.total_duration.as_secs_f64() * 1000.0);
6767
println!(" 🎵 Audio length: {:.2}s", self.audio_length_seconds);
6868
if self.audio_length_seconds > 0.0 {
69-
let real_time_factor = self.total_duration.as_secs_f64() / self.audio_length_seconds as f64;
69+
let real_time_factor = self.total_duration.as_secs_f64() / f64::from(self.audio_length_seconds);
7070
println!(" ⚡ Real-time factor: {real_time_factor:.2}x");
7171
}
7272
}
@@ -77,7 +77,7 @@ pub async fn transcribe_audio(
7777
mut multipart: Multipart,
7878
) -> Result<Response, (StatusCode, Json<ErrorResponse>)> {
7979
let start_time = Instant::now();
80-
let mut stats = ProcessingStats::new();
80+
let mut processing_stats = ProcessingStats::new();
8181

8282
// Extract both audio file and parameters from multipart form
8383
let (audio_data, params) = match extract_multipart_data(&mut multipart).await {
@@ -102,8 +102,7 @@ pub async fn transcribe_audio(
102102
// Parse streaming parameter from form data
103103
let stream_enabled = params
104104
.get("stream")
105-
.map(|s| s.parse::<bool>().unwrap_or(false))
106-
.unwrap_or(false);
105+
.is_some_and(|s| s.parse::<bool>().unwrap_or(false));
107106

108107
// Get model name from parameters and clone it to make it owned
109108
let model_name = params
@@ -130,27 +129,28 @@ pub async fn transcribe_audio(
130129
));
131130
},
132131
};
133-
stats.audio_conversion_duration = conversion_start.elapsed();
134-
stats.audio_length_seconds = pcm_data.len() as f32 / 16000.0; // Assuming 16kHz sample rate
135132

136-
println!("Audio data length: {} samples ({:.2}s)", pcm_data.len(), stats.audio_length_seconds);
133+
processing_stats.audio_conversion_duration = conversion_start.elapsed();
134+
processing_stats.audio_length_seconds = pcm_data.len() as f32 / 16000.0; // Assuming 16kHz sample rate
135+
136+
println!("Audio data length: {} samples ({:.2}s)", pcm_data.len(), processing_stats.audio_length_seconds);
137137

138138
if stream_enabled {
139139
// Return streaming response
140-
let stream = create_transcription_stream(state, model_name, pcm_data, stats).await?;
140+
let stream = create_transcription_stream(state, model_name, pcm_data, processing_stats).await?;
141141
let sse = Sse::new(stream).keep_alive(KeepAlive::default());
142142
Ok(sse.into_response())
143143
} else {
144144
// Return single response
145-
match transcribe_audio_complete(state, model_name, pcm_data, &mut stats).await {
145+
match transcribe_audio_complete(state, model_name, pcm_data, &mut processing_stats).await {
146146
Ok(transcript) => {
147-
stats.total_duration = start_time.elapsed();
148-
stats.print_summary();
147+
processing_stats.total_duration = start_time.elapsed();
148+
processing_stats.print_summary();
149149
Ok(Json(TranscriptionResponse { text: transcript }).into_response())
150150
},
151151
Err(e) => {
152-
stats.total_duration = start_time.elapsed();
153-
stats.print_summary();
152+
processing_stats.total_duration = start_time.elapsed();
153+
processing_stats.print_summary();
154154
Err((
155155
StatusCode::INTERNAL_SERVER_ERROR,
156156
Json(ErrorResponse {
@@ -192,15 +192,16 @@ async fn extract_multipart_data(multipart: &mut Multipart) -> Result<(Vec<u8>, H
192192
}
193193

194194
// Convert various audio formats to PCM
195+
#[allow(clippy::unused_async)]
195196
async fn convert_audio_to_pcm(audio_data: &[u8]) -> Result<Vec<f32>> {
196197
let cursor = std::io::Cursor::new(audio_data.to_vec());
197-
let media_source = MediaSourceStream::new(Box::new(cursor), Default::default());
198+
let media_source = MediaSourceStream::new(Box::new(cursor), MediaSourceStreamOptions::default());
198199

199200
let mut hint = Hint::new();
200201
hint.mime_type("audio/wav"); // You might want to detect this automatically
201202

202-
let meta_opts: MetadataOptions = Default::default();
203-
let fmt_opts: FormatOptions = Default::default();
203+
let meta_opts = MetadataOptions::default();
204+
let fmt_opts = FormatOptions::default();
204205

205206
let probed = get_probe().format(&hint, media_source, &fmt_opts, &meta_opts)?;
206207

@@ -211,7 +212,7 @@ async fn convert_audio_to_pcm(audio_data: &[u8]) -> Result<Vec<f32>> {
211212
.find(|t| t.codec_params.codec != symphonia::core::codecs::CODEC_TYPE_NULL)
212213
.ok_or_else(|| anyhow::anyhow!("No audio track found"))?;
213214

214-
let dec_opts: DecoderOptions = Default::default();
215+
let dec_opts = DecoderOptions::default();
215216
let mut decoder = symphonia::default::get_codecs().make(&track.codec_params, &dec_opts)?;
216217

217218
let track_id = track.id;
@@ -236,6 +237,7 @@ async fn convert_audio_to_pcm(audio_data: &[u8]) -> Result<Vec<f32>> {
236237
},
237238
AudioBufferRef::S32(buf) => {
238239
for &sample in buf.chan(0) {
240+
#[allow(clippy::cast_precision_loss)]
239241
pcm_data.push(sample as f32 / i32::MAX as f32);
240242
}
241243
},
@@ -253,14 +255,14 @@ async fn transcribe_audio_complete(
253255
state: Arc<AppState>,
254256
model_name: String, // Change to owned String
255257
audio_data: Vec<f32>,
256-
stats: &mut ProcessingStats,
258+
processing_stats: &mut ProcessingStats,
257259
) -> Result<String> {
258260
let sample_rate = 16000;
259261

260262
// Get the appropriate Whisper processor for this model with timing
261263
let model_loading_start = Instant::now();
262264
let whisper_processor = state.get_whisper_processor(&model_name).await?;
263-
stats.model_loading_duration = model_loading_start.elapsed();
265+
processing_stats.model_loading_duration = model_loading_start.elapsed();
264266

265267
// Process audio through VAD and Whisper
266268
let mut vad = state.vad.lock().await;
@@ -296,8 +298,8 @@ async fn transcribe_audio_complete(
296298
}
297299
}
298300

299-
stats.vad_processing_duration = vad_start.elapsed() - whisper_total_time;
300-
stats.whisper_transcription_duration = whisper_total_time;
301+
processing_stats.vad_processing_duration = vad_start.elapsed() - whisper_total_time;
302+
processing_stats.whisper_transcription_duration = whisper_total_time;
301303

302304
Ok(transcripts.join(" "))
303305
}
@@ -307,7 +309,7 @@ async fn create_transcription_stream(
307309
state: Arc<AppState>,
308310
model_name: String, // Change to owned String
309311
audio_data: Vec<f32>,
310-
mut stats: ProcessingStats,
312+
mut processing_stats: ProcessingStats,
311313
) -> Result<impl Stream<Item = Result<Event, anyhow::Error>>, (StatusCode, Json<ErrorResponse>)> {
312314
let stream_start = Instant::now();
313315

@@ -329,11 +331,11 @@ async fn create_transcription_stream(
329331
));
330332
},
331333
};
332-
stats.model_loading_duration = model_loading_start.elapsed();
334+
processing_stats.model_loading_duration = model_loading_start.elapsed();
333335

334336
let sample_rate = 16000;
335337

336-
Ok(stream::unfold((state, whisper_processor, audio_data, 0, AudioBuffer::new(10000, 100, 500, sample_rate), stats, stream_start), move |(state, whisper_processor, audio_data, mut processed, mut audio_buffer, mut stats, stream_start)| async move {
338+
Ok(stream::unfold((state, whisper_processor, audio_data, 0, AudioBuffer::new(10000, 100, 500, sample_rate), processing_stats, stream_start), move |(state, whisper_processor, audio_data, mut processed, mut audio_buffer, mut stats, stream_start)| async move {
337339
if processed >= audio_data.len() {
338340
// Print final statistics for streaming
339341
stats.total_duration = stream_start.elapsed();
@@ -381,11 +383,14 @@ async fn create_transcription_stream(
381383

382384
// Create event with actual transcription or progress update
383385
let event_data = if let Some(transcript) = whisper_result {
384-
StreamChunk { text: transcript, timestamp: Some(processed as f64 / sample_rate as f64) }
386+
#[allow(clippy::cast_precision_loss)]
387+
StreamChunk { text: transcript, timestamp: Some(processed as f64 / f64::from(sample_rate)) }
385388
} else {
386389
StreamChunk {
387-
text: format!("Processing... ({:.1}%)", (processed as f64 / audio_data.len() as f64) * 100.0),
388-
timestamp: Some(processed as f64 / sample_rate as f64),
390+
#[allow(clippy::cast_precision_loss)]
391+
text: format!("Processing... ({:.1}%)", (processed as f64 / audio_data.len() as f64) * 100.0),
392+
#[allow(clippy::cast_precision_loss)]
393+
timestamp: Some(processed as f64 / f64::from(sample_rate)),
389394
}
390395
};
391396

0 commit comments

Comments
 (0)