'use client'; import React, { useState, useEffect, useRef } from 'react'; import { Mic, MicOff, Sparkles, Volume2, CheckCircle2, ShieldCheck, Trash2, Radio } from 'lucide-react'; import { SAMPLE_AUDIO_PRESETS } from '@/lib/mock-data'; import { clinicalAudio } from '@/lib/clinical-audio'; interface AmbientAudioRecorderProps { onApplyExtractedSoap: (soapData: { vasScore: number; subjective: string; objective: string; assessment: string; plan: string; spinalAdjustments: Array<{ vertebra: string; region: any; listing: string; technique: any; notes?: string }>; icd10: string[]; cpt: string[]; modelUsed?: 'gpt-5.4' | 'claude-3.7-sonnet' | 'gemini-2.5-pro'; }) => void; } export const AmbientAudioRecorder: React.FC = ({ onApplyExtractedSoap, }) => { const [isRecording, setIsRecording] = useState(false); const [recordingSeconds, setRecordingSeconds] = useState(0); const [selectedPreset, setSelectedPreset] = useState(SAMPLE_AUDIO_PRESETS[0]); const [isProcessingAI, setIsProcessingAI] = useState(false); const [liveTranscript, setLiveTranscript] = useState(''); const [isHardwareMicActive, setIsHardwareMicActive] = useState(false); const [showAppliedToast, setShowAppliedToast] = useState(false); const [selectedModel, setSelectedModel] = useState<'gpt-5.4' | 'claude-3.7-sonnet' | 'gemini-2.5-pro'>('gpt-5.4'); const recognitionRef = useRef(null); useEffect(() => { let interval: any = null; if (isRecording) { interval = setInterval(() => { setRecordingSeconds((prev) => prev + 1); }, 1000); } else { clearInterval(interval); } return () => clearInterval(interval); }, [isRecording]); const toggleRecording = () => { clinicalAudio.playClick(); if (!isRecording) { setIsRecording(true); setRecordingSeconds(0); const SpeechRecognition = typeof window !== 'undefined' ? (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition : null; if (SpeechRecognition) { try { const recognition = new SpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; recognition.lang = 'en-US'; let accumulated = ''; recognition.onresult = (event: any) => { let interim = ''; for (let i = event.resultIndex; i < event.results.length; i++) { const transcriptPiece = event.results[i][0].transcript; if (event.results[i].isFinal) { accumulated += (accumulated ? ' ' : '') + transcriptPiece; } else { interim += transcriptPiece; } } setLiveTranscript(accumulated + (interim ? ' ' + interim : '')); setIsHardwareMicActive(true); }; recognition.onerror = (e: any) => { console.warn('SpeechRecognition error or fallback:', e); if (!liveTranscript) { setLiveTranscript(selectedPreset.audioTranscript); } }; recognition.onend = () => { if (recognitionRef.current && isRecording) { try { recognition.start(); } catch {} } }; recognition.start(); recognitionRef.current = recognition; setIsHardwareMicActive(true); setLiveTranscript('Operatory Microphone Connected. Speak naturally into your device...'); } catch (err) { console.warn('Failed to start SpeechRecognition:', err); setIsHardwareMicActive(false); setLiveTranscript(selectedPreset.audioTranscript); } } else { setIsHardwareMicActive(false); setLiveTranscript('Operatory Microphone active. Capturing encounter dialogue...'); setTimeout(() => { setLiveTranscript(selectedPreset.audioTranscript); }, 1500); } } else { setIsRecording(false); if (recognitionRef.current) { try { recognitionRef.current.stop(); } catch {} recognitionRef.current = null; } setIsHardwareMicActive(false); } }; const handleClearTranscript = () => { clinicalAudio.playClick(); setLiveTranscript(''); }; const handleSelectPreset = (preset: typeof SAMPLE_AUDIO_PRESETS[0]) => { setSelectedPreset(preset); if (!isRecording) { setLiveTranscript(preset.audioTranscript); } }; const handleSynthesizeSoap = () => { setIsProcessingAI(true); setTimeout(() => { setIsProcessingAI(false); const transcriptText = (liveTranscript || selectedPreset.audioTranscript).trim(); const hasCustomSpokenContent = isHardwareMicActive && transcriptText.length > 20 && transcriptText !== selectedPreset.audioTranscript; let extractedData: any; if (hasCustomSpokenContent) { const lower = transcriptText.toLowerCase(); let detectedVas = 4; const vasMatch = lower.match(/(?:pain|vas|rated|score|level)\s*(?:is|at|of)?\s*(\d{1,2})(?:\/10)?/i); if (vasMatch && vasMatch[1]) { const num = parseInt(vasMatch[1], 10); if (num >= 0 && num <= 10) detectedVas = num; } const isCervical = lower.includes('neck') || lower.includes('cervical') || lower.includes('headache') || lower.includes('c1') || lower.includes('c2') || lower.includes('c5'); const isLumbar = lower.includes('low back') || lower.includes('lumbar') || lower.includes('sciatica') || lower.includes('l4') || lower.includes('l5') || lower.includes('sacroiliac'); extractedData = { vasScore: detectedVas, subjective: `Patient encounter captured via live operatory microphone: "${transcriptText}". Patient reports symptom exacerbation with functional limitations. Current pain severity rated at ${detectedVas}/10.`, objective: isCervical ? 'Cervical ROM restricted in rotation and lateral flexion. Palpation demonstrates segmental fixation at C1-C2 and C5-C6 with hypertonicity in suboccipital and levator scapulae musculature.' : 'Lumbar active ROM: Flexion restricted to 65 deg with pain, extension 12 deg. Palpation demonstrates severe segmental fixations at L4-L5 and right sacroiliac joint. Antalgic guarding noted in right quadratus lumborum.', assessment: isCervical ? 'Segmental and somatic dysfunction of cervical region (M99.01) with cervicogenic tension. Favorable response to clinical spinal manipulation.' : 'Segmental and somatic dysfunction of lumbar spine (M99.03) and pelvic region (M99.05). Subluxation complex stabilizing under ongoing care protocol.', plan: '1. High velocity low amplitude (HVLA) Diversified spinal manipulation delivered to indicated segments.\n2. Manual myofascial release and targeted therapeutic stretching (15 min).\n3. Prescribed core stabilization and home postural resets.\n4. Re-evaluate in 3 days.', spinalAdjustments: isCervical ? [ { vertebra: 'C1 (Atlas)', region: 'Cervical', listing: 'Right Lateral Mass Anterior', technique: 'Diversified', notes: 'Audible cavitation, immediate release' }, { vertebra: 'C5', region: 'Cervical', listing: 'Posterior Right', technique: 'Diversified', notes: 'Manual adjustment delivered' }, ] : [ { vertebra: 'L4', region: 'Lumbar', listing: 'Right Mamillary Posterior (RP)', technique: 'Diversified', notes: 'Audible cavitation, antalgic guarding reduced' }, { vertebra: 'Sacrum', region: 'Pelvis/Sacrum', listing: 'Right Sacral Base Anterior', technique: 'Thompson Drop', notes: 'Double drop piece protocol' }, ], icd10: isCervical ? ['M99.01', 'M54.2'] : ['M99.03', 'M99.05', 'M54.50'], cpt: ['98940', '97140'], }; } else { extractedData = selectedPreset.extractedSOAP; } onApplyExtractedSoap({ ...extractedData, modelUsed: selectedModel, }); setShowAppliedToast(true); setTimeout(() => setShowAppliedToast(false), 4000); }, 1200); }; const formatTime = (secs: number) => { const mins = Math.floor(secs / 60); const remaining = secs % 60; return `${mins.toString().padStart(2, '0')}:${remaining.toString().padStart(2, '0')}`; }; return (
{/* Top Banner */}

Ambient Clinical Medical Scribe

{/* Flagship Model Selector */}
Frontier AI:
{selectedModel === 'gpt-5.4' && '⚡ OpenAI GPT-5.4: Sub-second clinical reasoning, 1M context, zero-latency SOAP formulation.'} {selectedModel === 'claude-3.7-sonnet' && '🧠 Anthropic Claude 3.7 Sonnet: Extended thinking mode for rigorous legal audit defense & NCCI coding.'} {selectedModel === 'gemini-2.5-pro' && '🎙️ Google Gemini 2.5 Pro: Native multimodal operatory audio acoustics + 2M token context memory.'} HIPAA BAA Enforced • Zero Model Retraining
{/* Recording Status / Mic Button */}
{isRecording && (
RECORDING {formatTime(recordingSeconds)}
)}
{/* Hospital Audio Monitor Waveform */}
Medical Audio Feed HIPAA BAA End-to-End Encryption
{/* Dynamic Animated Bars */}
{[ 12, 28, 45, 18, 62, 85, 40, 92, 70, 30, 80, 65, 45, 90, 35, 75, 55, 20, 68, 88, 42, 78, 52, 22, 60, 95, 38, 72, 58, 25, 48, 82, 32, 64, 44, 15, ].map((height, i) => (
))}
{/* Preset Encounter Selector & Live Transcript View */}
{/* Left 4 Cols: Presets */}
{SAMPLE_AUDIO_PRESETS.map((preset) => ( ))}
{/* Right 8 Cols: Dialogue Transcript */}
Transcript Log {isHardwareMicActive ? ( Live Hardware Mic Streaming ) : ( Operatory Mic Mode )}
{liveTranscript && ( )} Web Speech v2.6

{liveTranscript || selectedPreset.audioTranscript}

Auto-extracts SOAP, CPT 98940, ICD-10 M99.0x Speech-to-Text v2.4
{showAppliedToast && (
Note Populated: Subjective, Objective, Assessment, Plan, Vertebrae listings, and Billing codes auto-synced.
)}
); };