| | """ |
| | 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!") |