diff --git a/web/frontend/src/components/AudioDetailView.tsx b/web/frontend/src/components/AudioDetailView.tsx index ae4976d7..57e9abd0 100644 --- a/web/frontend/src/components/AudioDetailView.tsx +++ b/web/frontend/src/components/AudioDetailView.tsx @@ -1277,7 +1277,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD {(currentStatus || audioFile.status) === "completed" && transcript && (
{/* Header Section */} -
+
{/* Title Row */}
@@ -1316,7 +1316,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD > {notes.length > 0 && ( - + {notes.length > 99 ? '99+' : notes.length} )} @@ -1447,7 +1447,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD > {notes.length > 0 && ( - + {notes.length > 99 ? '99+' : notes.length} )} @@ -1921,7 +1921,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD - + Transcription Execution Details @@ -1943,20 +1943,20 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD // Multi-track timing display
{/* Overall Processing Time */} -
-

- +
+

+ Overall Processing Time

-
- Started: +
+ Started:

{new Date(executionData.started_at).toLocaleString()}

-
- Completed: +
+ Completed:

{executionData.completed_at ? new Date(executionData.completed_at).toLocaleString() @@ -1964,9 +1964,9 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD }

-
- Total Duration: -

+

+ Total Duration: +

{executionData.processing_duration ? `${(executionData.processing_duration / 1000).toFixed(1)}s` : 'N/A' @@ -1978,22 +1978,22 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD {/* Individual Track Processing */} {executionData.multi_track_timings && executionData.multi_track_timings.length > 0 && ( -

-

- +
+

+ Individual Track Processing

{executionData.multi_track_timings.map((timing, index) => ( -
-
+
+
- + {timing.track_name} - + {(timing.duration / 1000).toFixed(1)}s
@@ -2016,16 +2016,16 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD {/* Audio Merge Phase */} {executionData.merge_duration && ( -
-

- +
+

+ Transcript Merge Phase

-
- Started: +
+ Started:

{executionData.merge_start_time ? new Date(executionData.merge_start_time).toLocaleTimeString() @@ -2033,8 +2033,8 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD }

-
- Completed: +
+ Completed:

{executionData.merge_end_time ? new Date(executionData.merge_end_time).toLocaleTimeString() @@ -2042,9 +2042,9 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD }

-
- Duration: -

+

+ Duration: +

{(executionData.merge_duration / 1000).toFixed(1)}s

@@ -2260,20 +2260,20 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD ) : ( // Single track execution info
-
-

- +
+

+ Processing Time

-
- Started: +
+ Started:

{new Date(executionData.started_at).toLocaleString()}

-
- Completed: +
+ Completed:

{executionData.completed_at ? new Date(executionData.completed_at).toLocaleString() @@ -2281,18 +2281,18 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD }

-
- Duration: -

+

+ Duration: +

{executionData.processing_duration ? `${(executionData.processing_duration / 1000).toFixed(1)}s` : 'N/A' }

-
- Audio Length: -

+

+ Audio Length: +

{(() => { const duration = getAudioDurationFromTranscript(transcript); return duration ? formatDuration(duration) : 'N/A'; @@ -2316,7 +2316,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD

{/* Model Settings */} -
+

Model & Configuration

@@ -2378,7 +2378,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD {/* Processing Settings - Only for WhisperX */} {executionData.actual_parameters?.model_family === 'whisper' && ( -
+

Processing

@@ -2427,7 +2427,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD {/* Speaker Diarization Settings - For all model families and multi-track jobs */} {(executionData.actual_parameters?.diarize || executionData.is_multi_track) && ( -
+

Speaker Diarization @@ -2475,7 +2475,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD {/* Advanced Settings - Only for WhisperX */} {executionData.actual_parameters?.model_family === 'whisper' && ( -
+

Advanced

@@ -2516,7 +2516,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD {/* Advanced Settings - Only for NVIDIA Parakeet/Canary */} {(executionData.actual_parameters?.model_family === 'nvidia_parakeet' || executionData.actual_parameters?.model_family === 'nvidia_canary') && ( -
+

Advanced

@@ -2550,7 +2550,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD {/* Parameters */} {executionData.actual_parameters && ( -
+

Parameters Used @@ -2576,7 +2576,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD - + Transcription Logs @@ -2605,7 +2605,7 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD - + Transcription Logs @@ -2651,9 +2651,9 @@ export const AudioDetailView = memo(function AudioDetailView({ audioId }: AudioD {showSelectionMenu && (
e.stopPropagation()}> -
-
diff --git a/web/frontend/src/components/audio/AudioPlayer.tsx b/web/frontend/src/components/audio/AudioPlayer.tsx index cfe553a9..0a90ad21 100644 --- a/web/frontend/src/components/audio/AudioPlayer.tsx +++ b/web/frontend/src/components/audio/AudioPlayer.tsx @@ -1,8 +1,7 @@ import { useEffect, useRef, useState, forwardRef, useImperativeHandle } from 'react'; import WaveSurfer from 'wavesurfer.js'; -import { Play, Pause, Volume2, VolumeX, SkipBack, SkipForward } from 'lucide-react'; +import { Play, Pause, SkipBack, SkipForward } from 'lucide-react'; import { Button } from '@/components/ui/button'; -import { Slider } from '@/components/ui/slider'; import { useTheme } from '@/contexts/ThemeContext'; import { useAuth } from '@/contexts/AuthContext'; @@ -39,8 +38,6 @@ export const AudioPlayer = forwardRef(({ const [isPlaying, setIsPlaying] = useState(false); const [duration, setDuration] = useState(0); const [currentTime, setCurrentTime] = useState(0); - const [volume, setVolume] = useState(1); - const [isMuted, setIsMuted] = useState(false); const [isReady, setIsReady] = useState(false); useImperativeHandle(ref, () => ({ @@ -156,23 +153,6 @@ export const AudioPlayer = forwardRef(({ wavesurferRef.current?.skip(-5); }; - const handleVolumeChange = (value: number[]) => { - const newVol = value[0]; - setVolume(newVol); - if (newVol > 0) setIsMuted(false); - wavesurferRef.current?.setVolume(newVol); - }; - - const toggleMute = () => { - if (isMuted) { - wavesurferRef.current?.setVolume(volume); - setIsMuted(false); - } else { - wavesurferRef.current?.setVolume(0); - setIsMuted(true); - } - }; - const formatTime = (seconds: number) => { const mins = Math.floor(seconds / 60); const secs = Math.floor(seconds % 60); @@ -182,21 +162,33 @@ export const AudioPlayer = forwardRef(({ return (
- {/* Main Controls Row */} -
- {/* Play/Pause Button - Prominent */} - +
+ {/* Left Column: Playback Controls */} +
+ {/* Play/Pause Button */} + - {/* Waveform & Time Info */} + {/* Seek Buttons (Below Play/Pause) */} +
+ + +
+
+ + {/* Right Column: Waveform & Info */}
{/* Time & Title Row */}
@@ -222,37 +214,7 @@ export const AudioPlayer = forwardRef(({
{/* Secondary Controls Row (Volume, Skip) - Only visible when expanded */} - {!collapsed && ( -
-
- - -
-
- -
- -
-
-
- )}
); }); diff --git a/web/frontend/src/components/transcript/TranscriptView.tsx b/web/frontend/src/components/transcript/TranscriptView.tsx index c7c44965..2981fb59 100644 --- a/web/frontend/src/components/transcript/TranscriptView.tsx +++ b/web/frontend/src/components/transcript/TranscriptView.tsx @@ -43,7 +43,7 @@ export const TranscriptView = forwardRef(({ if (!transcript) { return ( -
+

No transcript available.

); @@ -56,11 +56,11 @@ export const TranscriptView = forwardRef(({ // Render transcript with word-level highlighting for compact view const renderCompactView = () => { if (!transcript.word_segments || transcript.word_segments.length === 0) { - return

{transcript.text}

; + return

{transcript.text}

; } return ( -
+
{transcript.word_segments.map((word, index) => { const isHighlighted = index === currentWordIndex; const isAnnotated = notes.some(n => index >= n.start_word_index && index <= n.end_word_index); @@ -76,8 +76,8 @@ export const TranscriptView = forwardRef(({ className={cn( "cursor-text transition-colors duration-150 rounded px-0.5 inline-block", "hover:bg-blue-100 dark:hover:bg-blue-900/30", - isHighlighted && "bg-amber-200 dark:bg-amber-700/50 text-stone-900 dark:text-stone-50 font-medium shadow-sm", - !isHighlighted && isAnnotated && "bg-stone-200 dark:bg-stone-700/50 border-b-2 border-amber-400 dark:border-amber-600" + isHighlighted && "bg-amber-200 dark:bg-amber-700/50 text-gray-900 dark:text-gray-50 font-medium shadow-sm", + !isHighlighted && isAnnotated && "bg-gray-200 dark:bg-gray-700/50 border-b-2 border-amber-400 dark:border-amber-600" )} > {word.word}{" "} @@ -123,8 +123,8 @@ export const TranscriptView = forwardRef(({ className={cn( "cursor-text transition-colors duration-150 rounded px-0.5 inline-block", "hover:bg-blue-100 dark:hover:bg-blue-900/30", - isHighlighted && "bg-amber-200 dark:bg-amber-700/50 text-stone-900 dark:text-stone-50 font-medium shadow-sm", - !isHighlighted && isAnnotated && "bg-stone-200 dark:bg-stone-700/50 border-b-2 border-amber-400 dark:border-amber-600" + isHighlighted && "bg-amber-200 dark:bg-amber-700/50 text-gray-900 dark:text-gray-50 font-medium shadow-sm", + !isHighlighted && isAnnotated && "bg-gray-200 dark:bg-gray-700/50 border-b-2 border-amber-400 dark:border-amber-600" )} > {word.word}{" "} @@ -141,15 +141,15 @@ export const TranscriptView = forwardRef(({ return (
{transcript.segments.map((segment, i) => ( -
+
{/* Timestamp & Speaker */} -
- +
+ {new Date(segment.start * 1000).toISOString().substr(11, 8)} {segment.speaker && ( {getDisplaySpeakerName(segment.speaker)} @@ -158,7 +158,7 @@ export const TranscriptView = forwardRef(({
{/* Text */} -
+
{renderSegmentWords(segment)}
@@ -170,7 +170,7 @@ export const TranscriptView = forwardRef(({ return (
{mode === 'compact' ? renderCompactView() : renderExpandedView()}