# Forced Alignment Core


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

## ForcedAlignItem

A single word-level alignment result from a forced alignment model. Each
item represents one word with its temporal boundaries in the audio.

Note that forced alignment models typically strip punctuation from the
input text. The consuming service is responsible for mapping these
stripped words back to the original punctuated text.

------------------------------------------------------------------------

<a
href="https://github.com/cj-mills/cjm-transcription-plugin-system/blob/main/cjm_transcription_plugin_system/forced_alignment_core.py#L14"
target="_blank" style="float:right; font-size:smaller">source</a>

### ForcedAlignItem

``` python

def ForcedAlignItem(
    text:str, start_time:float, end_time:float
)->None:

```

*A single word-level alignment result.*

## ForcedAlignResult

Standardized output for all forced alignment plugins. Contains the list
of word-level alignments and optional metadata about the alignment run.

------------------------------------------------------------------------

<a
href="https://github.com/cj-mills/cjm-transcription-plugin-system/blob/main/cjm_transcription_plugin_system/forced_alignment_core.py#L22"
target="_blank" style="float:right; font-size:smaller">source</a>

### ForcedAlignResult

``` python

def ForcedAlignResult(
    items:List, metadata:Dict=<factory>
)->None:

```

*Standardized output for all forced alignment plugins.*

## Testing

``` python
# Test ForcedAlignItem creation
item = ForcedAlignItem(text="November", start_time=1.04, end_time=1.6)
print(f"Item: {item}")
assert item.text == "November"
assert item.start_time == 1.04
assert item.end_time == 1.6

# Test serialization round-trip
d = asdict(item)
assert d == {"text": "November", "start_time": 1.04, "end_time": 1.6}
reconstructed = ForcedAlignItem(**d)
assert reconstructed == item
print(f"Serialization round-trip: OK")
```

    Item: ForcedAlignItem(text='November', start_time=1.04, end_time=1.6)
    Serialization round-trip: OK

``` python
# Test ForcedAlignResult creation
items = [
    ForcedAlignItem(text="November", start_time=1.04, end_time=1.6),
    ForcedAlignItem(text="the", start_time=1.6, end_time=1.68),
    ForcedAlignItem(text="10th", start_time=1.76, end_time=2.08),
]

result = ForcedAlignResult(
    items=items,
    metadata={"model_id": "Qwen/Qwen3-ForcedAligner-0.6B", "language": "English"}
)

print(f"Result: {len(result.items)} items")
print(f"Metadata: {result.metadata}")
assert len(result.items) == 3
assert result.items[0].text == "November"
assert result.metadata["model_id"] == "Qwen/Qwen3-ForcedAligner-0.6B"
```

    Result: 3 items
    Metadata: {'model_id': 'Qwen/Qwen3-ForcedAligner-0.6B', 'language': 'English'}

``` python
# Test ForcedAlignResult serialization round-trip
d = asdict(result)
assert len(d["items"]) == 3
assert d["items"][0] == {"text": "November", "start_time": 1.04, "end_time": 1.6}

# Reconstruct from dict
reconstructed = ForcedAlignResult(
    items=[ForcedAlignItem(**item_dict) for item_dict in d["items"]],
    metadata=d["metadata"]
)
assert len(reconstructed.items) == 3
assert reconstructed.items[0] == result.items[0]
assert reconstructed.metadata == result.metadata
print("ForcedAlignResult serialization round-trip: OK")
```

    ForcedAlignResult serialization round-trip: OK

``` python
# Test minimal result (empty items, no metadata)
minimal = ForcedAlignResult(items=[])
assert minimal.items == []
assert minimal.metadata == {}
print(f"Minimal result: {minimal}")
```

    Minimal result: ForcedAlignResult(items=[], metadata={})
