|
""" |
|
Speaker Segmentation 集成测试 |
|
验证完整的转录和说话人分割流程 |
|
""" |
|
|
|
import pytest |
|
import sys |
|
import os |
|
|
|
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
|
|
|
from src.services.transcription_service import TranscriptionService |
|
|
|
|
|
def test_speaker_segmentation_integration(): |
|
"""测试完整的说话人分割集成流程""" |
|
service = TranscriptionService() |
|
|
|
|
|
transcription_segments = [ |
|
{ |
|
"start": 0.0, |
|
"end": 3.0, |
|
"text": "Hello, this is Alice speaking." |
|
}, |
|
{ |
|
"start": 3.0, |
|
"end": 8.0, |
|
"text": "Hi Alice, this is Bob responding to your message." |
|
}, |
|
{ |
|
"start": 8.0, |
|
"end": 12.0, |
|
"text": "Great to hear from you Bob, how are you today?" |
|
}, |
|
{ |
|
"start": 12.0, |
|
"end": 15.0, |
|
"text": "I'm doing well, thank you for asking Alice." |
|
} |
|
] |
|
|
|
|
|
speaker_segments = [ |
|
{"start": 0.0, "end": 3.0, "speaker": "SPEAKER_00"}, |
|
{"start": 3.0, "end": 8.0, "speaker": "SPEAKER_01"}, |
|
{"start": 8.0, "end": 12.0, "speaker": "SPEAKER_00"}, |
|
{"start": 12.0, "end": 15.0, "speaker": "SPEAKER_01"} |
|
] |
|
|
|
|
|
result = service._merge_speaker_segments(transcription_segments, speaker_segments) |
|
|
|
|
|
assert len(result) == 4, f"Expected 4 segments, got {len(result)}" |
|
|
|
|
|
expected_speakers = ["SPEAKER_00", "SPEAKER_01", "SPEAKER_00", "SPEAKER_01"] |
|
actual_speakers = [seg["speaker"] for seg in result] |
|
assert actual_speakers == expected_speakers, f"Speaker assignment mismatch: {actual_speakers} != {expected_speakers}" |
|
|
|
|
|
expected_texts = [ |
|
"Hello, this is Alice speaking.", |
|
"Hi Alice, this is Bob responding to your message.", |
|
"Great to hear from you Bob, how are you today?", |
|
"I'm doing well, thank you for asking Alice." |
|
] |
|
actual_texts = [seg["text"] for seg in result] |
|
assert actual_texts == expected_texts, f"Text mismatch: {actual_texts} != {expected_texts}" |
|
|
|
|
|
for i, seg in enumerate(result): |
|
assert seg["start"] == transcription_segments[i]["start"] |
|
assert seg["end"] == transcription_segments[i]["end"] |
|
|
|
print("✅ Speaker segmentation integration test passed!") |
|
print(f" - Processed {len(transcription_segments)} transcription segments") |
|
print(f" - Applied {len(speaker_segments)} speaker assignments") |
|
print(f" - Generated {len(result)} final segments") |
|
|
|
|
|
print("\n📝 Sample Results:") |
|
for i, seg in enumerate(result): |
|
speaker_name = "Alice" if seg["speaker"] == "SPEAKER_00" else "Bob" |
|
print(f" {i+1}. [{seg['start']:.1f}s-{seg['end']:.1f}s] {speaker_name}: \"{seg['text']}\"") |
|
|
|
|
|
def test_complex_conversation_splitting(): |
|
"""测试复杂对话中的分割情况""" |
|
service = TranscriptionService() |
|
|
|
|
|
transcription_segments = [ |
|
{ |
|
"start": 0.0, |
|
"end": 10.0, |
|
"text": "Welcome to our podcast today we have a special guest joining us to discuss the latest developments in AI technology and its impact on society" |
|
} |
|
] |
|
|
|
|
|
speaker_segments = [ |
|
{"start": 0.0, "end": 3.0, "speaker": "HOST"}, |
|
{"start": 3.0, "end": 7.0, "speaker": "GUEST"}, |
|
{"start": 7.0, "end": 10.0, "speaker": "CO_HOST"} |
|
] |
|
|
|
result = service._merge_speaker_segments(transcription_segments, speaker_segments) |
|
|
|
|
|
assert len(result) == 3, f"Expected 3 segments after splitting, got {len(result)}" |
|
|
|
|
|
speakers = [seg["speaker"] for seg in result] |
|
assert speakers == ["HOST", "GUEST", "CO_HOST"] |
|
|
|
|
|
combined_text = " ".join([seg["text"] for seg in result if seg["text"]]) |
|
original_text = transcription_segments[0]["text"] |
|
|
|
|
|
combined_words = set(combined_text.lower().split()) |
|
original_words = set(original_text.lower().split()) |
|
|
|
|
|
preserved_ratio = len(combined_words.intersection(original_words)) / len(original_words) |
|
assert preserved_ratio > 0.8, f"Too many words lost: {preserved_ratio:.2f}" |
|
|
|
print("✅ Complex conversation splitting test passed!") |
|
print(f" - Split 1 long segment into {len(result)} speaker-specific segments") |
|
print(f" - Word preservation ratio: {preserved_ratio:.2%}") |
|
|
|
|
|
print("\n📝 Splitting Results:") |
|
for seg in result: |
|
print(f" [{seg['start']:.1f}s-{seg['end']:.1f}s] {seg['speaker']}: \"{seg['text'][:50]}{'...' if len(seg['text']) > 50 else ''}\"") |
|
|
|
|
|
if __name__ == "__main__": |
|
test_speaker_segmentation_integration() |
|
print() |
|
test_complex_conversation_splitting() |
|
print("\n🎉 All integration tests passed!") |