Implemented a module to detect filler segments, and skip them for purposes of same-speaker segment coalescing
This commit is contained in:
@@ -27,24 +27,24 @@ func Apply(in model.MergedTranscript, gap float64) (model.MergedTranscript, Summ
|
||||
coalescedID := 0
|
||||
|
||||
current := newRun(in.Segments[0])
|
||||
pendingBackchannels := make([]model.Segment, 0)
|
||||
pendingSkipped := make([]model.Segment, 0)
|
||||
for _, segment := range in.Segments[1:] {
|
||||
if current.canMerge(segment, gap) {
|
||||
current.add(segment)
|
||||
continue
|
||||
}
|
||||
if segment.Speaker != current.speaker() && hasCategory(segment, "backchannel") {
|
||||
pendingBackchannels = append(pendingBackchannels, segment)
|
||||
if segment.Speaker != current.speaker() && hasAnyCategory(segment, "backchannel", "filler") {
|
||||
pendingSkipped = append(pendingSkipped, segment)
|
||||
continue
|
||||
}
|
||||
|
||||
coalescedID = appendRun(&out, current, coalescedID, &summary)
|
||||
out.Segments = append(out.Segments, pendingBackchannels...)
|
||||
pendingBackchannels = pendingBackchannels[:0]
|
||||
out.Segments = append(out.Segments, pendingSkipped...)
|
||||
pendingSkipped = pendingSkipped[:0]
|
||||
current = newRun(segment)
|
||||
}
|
||||
coalescedID = appendRun(&out, current, coalescedID, &summary)
|
||||
out.Segments = append(out.Segments, pendingBackchannels...)
|
||||
out.Segments = append(out.Segments, pendingSkipped...)
|
||||
|
||||
return out, summary
|
||||
}
|
||||
@@ -129,10 +129,12 @@ func segmentRef(segment model.Segment) string {
|
||||
return segment.Source
|
||||
}
|
||||
|
||||
func hasCategory(segment model.Segment, category string) bool {
|
||||
func hasAnyCategory(segment model.Segment, categories ...string) bool {
|
||||
for _, existing := range segment.Categories {
|
||||
if existing == category {
|
||||
return true
|
||||
for _, category := range categories {
|
||||
if existing == category {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
|
||||
@@ -151,6 +151,20 @@ func TestApplyDropsBackchannelCategoryFromMergedSameSpeakerRun(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyDropsFillerCategoryFromMergedSameSpeakerRun(t *testing.T) {
|
||||
first := segment("a.json", 0, "Alice", 1, 2, "um")
|
||||
first.Categories = []string{"filler"}
|
||||
second := segment("a.json", 1, "Alice", 2.5, 3, "more")
|
||||
|
||||
got, _ := Apply(model.MergedTranscript{Segments: []model.Segment{first, second}}, 3)
|
||||
if len(got.Segments) != 1 {
|
||||
t.Fatalf("segment count = %d, want 1", len(got.Segments))
|
||||
}
|
||||
if got.Segments[0].Categories != nil {
|
||||
t.Fatalf("categories = %v, want nil", got.Segments[0].Categories)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplySkipsDifferentSpeakerBackchannelAsMergeBlocker(t *testing.T) {
|
||||
first := segment("a.json", 0, "Alice", 1, 2, "first")
|
||||
backchannel := segment("b.json", 0, "Bob", 2.2, 2.5, "yeah")
|
||||
@@ -172,6 +186,27 @@ func TestApplySkipsDifferentSpeakerBackchannelAsMergeBlocker(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplySkipsDifferentSpeakerFillerAsMergeBlocker(t *testing.T) {
|
||||
first := segment("a.json", 0, "Alice", 1, 2, "first")
|
||||
filler := segment("b.json", 0, "Bob", 2.2, 2.5, "um")
|
||||
filler.Categories = []string{"filler"}
|
||||
second := segment("a.json", 1, "Alice", 3, 4, "second")
|
||||
|
||||
got, summary := Apply(model.MergedTranscript{Segments: []model.Segment{first, filler, second}}, 3)
|
||||
if summary.OriginalSegmentsMerged != 2 || summary.CoalescedSegments != 1 {
|
||||
t.Fatalf("summary = %#v", summary)
|
||||
}
|
||||
if len(got.Segments) != 2 {
|
||||
t.Fatalf("segment count = %d, want 2", len(got.Segments))
|
||||
}
|
||||
if got.Segments[0].Text != "first second" {
|
||||
t.Fatalf("first output text = %q, want first second", got.Segments[0].Text)
|
||||
}
|
||||
if got.Segments[1].Text != "um" || !reflect.DeepEqual(got.Segments[1].Categories, []string{"filler"}) {
|
||||
t.Fatalf("second output segment = %#v", got.Segments[1])
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyDifferentSpeakerNonBackchannelStillBlocksMerge(t *testing.T) {
|
||||
first := segment("a.json", 0, "Alice", 1, 2, "first")
|
||||
bob := segment("b.json", 0, "Bob", 2.2, 2.5, "interruption")
|
||||
|
||||
Reference in New Issue
Block a user