/
AudioMediaSegmenter.java
113 lines (94 loc) · 5.36 KB
/
AudioMediaSegmenter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/******************************************************************************
* NOTICE *
* *
* This software (or technical data) was produced for the U.S. Government *
* under contract, and is subject to the Rights in Data-General Clause *
* 52.227-14, Alt. IV (DEC 2007). *
* *
* Copyright 2023 The MITRE Corporation. All Rights Reserved. *
******************************************************************************/
/******************************************************************************
* Copyright 2023 The MITRE Corporation *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
* You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
******************************************************************************/
package org.mitre.mpf.wfm.segmenting;
import org.apache.camel.CamelContext;
import org.apache.camel.Message;
import org.apache.camel.impl.DefaultMessage;
import org.mitre.mpf.wfm.buffers.DetectionProtobuf;
import org.mitre.mpf.wfm.buffers.DetectionProtobuf.AudioTrack;
import org.mitre.mpf.wfm.buffers.DetectionProtobuf.DetectionRequest.AudioRequest;
import org.mitre.mpf.wfm.camel.operations.detection.DetectionContext;
import org.mitre.mpf.wfm.data.entities.persistent.Media;
import org.mitre.mpf.wfm.data.entities.transients.Detection;
import org.mitre.mpf.wfm.data.entities.transients.Track;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@Component(AudioMediaSegmenter.REF)
public class AudioMediaSegmenter implements MediaSegmenter {
private static final Logger log = LoggerFactory.getLogger(AudioMediaSegmenter.class);
public static final String REF = "audioMediaSegmenter";
private final CamelContext _camelContext;
@Inject
AudioMediaSegmenter(CamelContext camelContext) {
_camelContext = camelContext;
}
@Override
public List<Message> createDetectionRequestMessages(Media media, DetectionContext context) {
log.warn("Media #{} is an audio file and will not be segmented.", media.getId());
if (!context.isFirstDetectionTask() && MediaSegmenter.feedForwardIsEnabled(context)) {
return createFeedForwardMessages(media, context);
}
return Collections.singletonList(
createProtobufMessage(media, context,
AudioRequest.newBuilder().setStartTime(0).setStopTime(-1).build()));
}
private Message createProtobufMessage(Media media, DetectionContext context,
AudioRequest audioRequest) {
DetectionProtobuf.DetectionRequest request = MediaSegmenter
.initializeRequest(media, context)
.setDataType(DetectionProtobuf.DetectionRequest.DataType.AUDIO)
.setAudioRequest(audioRequest)
.build();
Message message = new DefaultMessage(_camelContext);
message.setBody(request);
return message;
}
private List<Message> createFeedForwardMessages(Media media, DetectionContext context) {
List<Message> messages = new ArrayList<>();
for (Track track : context.getPreviousTracks()) {
AudioRequest.Builder audioRequest = AudioRequest.newBuilder()
.setStartTime(track.getStartOffsetTimeInclusive())
.setStopTime(track.getEndOffsetTimeInclusive());
Detection exemplar = track.getExemplar();
AudioTrack.Builder audioTrackBuilder = audioRequest.getFeedForwardTrackBuilder()
.setConfidence(exemplar.getConfidence())
.setStartTime(track.getStartOffsetTimeInclusive())
.setStopTime(track.getEndOffsetTimeInclusive());
for (Map.Entry<String, String> entry : exemplar.getDetectionProperties().entrySet()) {
audioTrackBuilder.addDetectionPropertiesBuilder()
.setKey(entry.getKey())
.setValue(entry.getValue());
}
messages.add(createProtobufMessage(media, context, audioRequest.build()));
}
return messages;
}
}