Transcribe during recording with recoverable chunks and microphone activity icon
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
"""Exercise real audio/session integration with deterministic provider responses."""
|
||||
import tempfile
|
||||
import threading
|
||||
import unittest
|
||||
|
||||
import numpy as np
|
||||
|
||||
from blurt_client import TranscriptionConfig
|
||||
from blurt_session import RecordingSession, TranscriptionScheduler
|
||||
|
||||
|
||||
class PipelineTests(unittest.TestCase):
|
||||
def test_real_audio_uploads_before_stop_and_seals_final_speech(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
requested = threading.Event()
|
||||
calls = []
|
||||
completions = []
|
||||
|
||||
def transcribe(audio, config):
|
||||
calls.append((len(audio), config))
|
||||
requested.set()
|
||||
return f"phrase {len(calls)}"
|
||||
|
||||
scheduler = TranscriptionScheduler(transcribe)
|
||||
config = TranscriptionConfig("test", "en", "openai", "fake")
|
||||
session = RecordingSession(48000, 1, config, directory, scheduler,
|
||||
on_complete=completions.append)
|
||||
try:
|
||||
tone = (0.05 * np.sin(2 * np.pi * 220 * np.arange(48000) / 48000)).astype(np.float32)
|
||||
for _ in range(9):
|
||||
self.assertTrue(session.feed(tone[:, None]))
|
||||
for _ in range(2):
|
||||
self.assertTrue(session.feed(np.zeros((48000, 1), dtype=np.float32)))
|
||||
self.assertTrue(requested.wait(5), "real pause detector did not upload during capture")
|
||||
self.assertIsNone(session.result)
|
||||
self.assertEqual(completions, [])
|
||||
self.assertTrue(session.feed(tone[:, None]))
|
||||
session.stop()
|
||||
result = session.join(5)
|
||||
self.assertIsNotNone(result)
|
||||
self.assertTrue(result.complete, result.errors)
|
||||
self.assertEqual(result.text, "phrase 1 phrase 2")
|
||||
self.assertEqual(sum(length for length, _ in calls), 12 * 16000)
|
||||
self.assertTrue(all(snapshot is config for _, snapshot in calls))
|
||||
session.acknowledge_delivery()
|
||||
self.assertFalse(session.path.exists())
|
||||
finally:
|
||||
session.stop()
|
||||
session.join(5)
|
||||
scheduler.shutdown()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user