2026-02-26 15:53:09 -08:00
|
|
|
"""Tests for transcription service."""
|
|
|
|
|
|
2026-03-20 13:47:57 -07:00
|
|
|
import inspect
|
|
|
|
|
|
2026-02-26 15:53:09 -08:00
|
|
|
from voice_to_notes.services.transcribe import (
|
|
|
|
|
SegmentResult,
|
2026-03-20 13:47:57 -07:00
|
|
|
TranscribeService,
|
2026-02-26 15:53:09 -08:00
|
|
|
TranscriptionResult,
|
|
|
|
|
WordResult,
|
|
|
|
|
result_to_payload,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_result_to_payload():
|
|
|
|
|
"""Test converting TranscriptionResult to IPC payload."""
|
|
|
|
|
result = TranscriptionResult(
|
|
|
|
|
segments=[
|
|
|
|
|
SegmentResult(
|
|
|
|
|
text="hello world",
|
|
|
|
|
start_ms=0,
|
|
|
|
|
end_ms=2000,
|
|
|
|
|
words=[
|
|
|
|
|
WordResult(word="hello", start_ms=0, end_ms=500, confidence=0.95),
|
|
|
|
|
WordResult(word="world", start_ms=600, end_ms=2000, confidence=0.92),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
language="en",
|
|
|
|
|
language_probability=0.98,
|
|
|
|
|
duration_ms=2000,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
payload = result_to_payload(result)
|
|
|
|
|
|
|
|
|
|
assert payload["language"] == "en"
|
|
|
|
|
assert payload["duration_ms"] == 2000
|
|
|
|
|
assert len(payload["segments"]) == 1
|
|
|
|
|
|
|
|
|
|
seg = payload["segments"][0]
|
|
|
|
|
assert seg["text"] == "hello world"
|
|
|
|
|
assert seg["start_ms"] == 0
|
|
|
|
|
assert seg["end_ms"] == 2000
|
|
|
|
|
assert len(seg["words"]) == 2
|
|
|
|
|
assert seg["words"][0]["word"] == "hello"
|
|
|
|
|
assert seg["words"][0]["confidence"] == 0.95
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_result_to_payload_empty():
|
|
|
|
|
"""Test empty transcription result."""
|
|
|
|
|
result = TranscriptionResult()
|
|
|
|
|
payload = result_to_payload(result)
|
|
|
|
|
assert payload["segments"] == []
|
|
|
|
|
assert payload["language"] == ""
|
|
|
|
|
assert payload["duration_ms"] == 0
|
2026-03-20 13:47:57 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_on_segment_callback():
|
|
|
|
|
"""Test that on_segment callback is invoked with correct SegmentResult and index."""
|
|
|
|
|
callback_args = []
|
|
|
|
|
|
|
|
|
|
def mock_callback(seg: SegmentResult, index: int):
|
|
|
|
|
callback_args.append((seg.text, index))
|
|
|
|
|
|
|
|
|
|
# Test that passing on_segment doesn't break the function signature
|
|
|
|
|
# (Full integration test would require mocking WhisperModel)
|
|
|
|
|
service = TranscribeService()
|
|
|
|
|
# Verify the parameter exists by checking the signature
|
|
|
|
|
sig = inspect.signature(service.transcribe)
|
|
|
|
|
assert "on_segment" in sig.parameters
|