Révision 3291

TXM/trunk/org.txm.groovy.core/src/groovy/org/txm/macro/transcription/TrimTranscriptionMacro.groovy (revision 3291)
1
// Copyright © 2010-2013 ENS de Lyon.
2
// Copyright © 2007-2010 ENS de Lyon, CNRS, INRP, University of
3
// Lyon 2, University of Franche-Comté, University of Nice
4
// Sophia Antipolis, University of Paris 3.
5
//
6
// The TXM platform is free software: you can redistribute it
7
// and/or modify it under the terms of the GNU General Public
8
// License as published by the Free Software Foundation,
9
// either version 2 of the License, or (at your option) any
10
// later version.
11
//
12
// The TXM platform is distributed in the hope that it will be
13
// useful, but WITHOUT ANY WARRANTY; without even the implied
14
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15
// PURPOSE. See the GNU General Public License for more
16
// details.
17
//
18
// You should have received a copy of the GNU General
19
// Public License along with the TXM platform. If not, see
20
// http://www.gnu.org/licenses.
21

  
22
package org.txm.macro.transcription
23

  
24
import java.text.SimpleDateFormat;
25
import java.util.Date;
26
import groovy.util.XmlParser
27

  
28
@Field @Option(name="trsFile", usage="Input TRS file", widget="FileOpen", required=true, def="")
29
		File trsFile;
30

  
31
@Field @Option(name="outputTrsFile", usage="Output TRS file", widget="FileSave", required=true, def="")
32
		File outputTrsFile;
33

  
34
@Field @Option(name="startOfRange", usage="Range start time in seconds", widget="String", required=true, def="0.0")
35
		def startOfRange
36

  
37
@Field @Option(name="endOfRange", usage="Range end time in seconds", widget="String", required=true, def="")
38
		def endOfRange
39

  
40
if (!ParametersDialog.open(this)) return;
41

  
42
startOfRange = Double.parseDouble(startOfRange)
43
endOfRange = Double.parseDouble(endOfRange)
44

  
45
def slurper = new XmlParser();
46
def trs = slurper.parse(trsFile)
47

  
48
// remove Turn not in the range
49
def sectionsToRemove = []
50
for (def section : trs.Episode.Section) { // all Section
51
	def toRemove = []
52
	def nTurnAndSync = 0
53
	for (def turn : section.Turn) { // all Section children
54

  
55
		def start = Double.parseDouble(getStartTime(turn))
56
		def end = Double.parseDouble(getEndTime(turn))
57

  
58
		//println "Removing ${turn.name()} at $start + $end in $startOfRange and $endOfRange ?"
59
		// cropping
60
		if (end < startOfRange) {
61
			toRemove << turn;
62
			continue // remove the whole Turn
63
		} else if (start > endOfRange) {
64
			toRemove << turn;
65
			continue // remove the whole Turn
66
		}
67

  
68
		boolean removing = true;
69
		def children = turn.children()
70
		for (int i = 0 ; i < children.size() ; i++) { // all Turn children ; using old for+int syntax
71
			def child = children[i]
72
			if (!(child instanceof String) && child.name().equals("Sync")) {
73

  
74
				start = Double.parseDouble(getStartTime(child))
75
				end = Double.parseDouble(getEndTime(child))
76

  
77
				//println "Removing ${child.name()} at $start + $end in $startOfRange and $endOfRange ?"
78
				// cropping
79
				if (end < startOfRange) removing = true;
80
				else if (start > endOfRange) removing = true;
81
				else removing = false
82

  
83
				// updating start and end times
84
				if (startOfRange > 0) {
85
					setStartTime(child, start - startOfRange)
86
					setEndTime(child, end - startOfRange)
87
				}
88
			}
89

  
90
			if (removing) {
91
				//println "remove $child"
92
				children.remove(child)
93
				i--
94
			}
95
		}
96
		turn.value = children
97
	}
98
	
99
	for (def child : toRemove) child.parent().remove(child);
100
	
101
	if (section.Turn.size() == 0) { // all Turns and Syncs have been removed -> remove the section
102
		sectionsToRemove << section
103
	}
104
}
105

  
106
for (def section : sectionsToRemove) section.parent().remove(section);
107

  
108
// fixing startTimes and endTimes of Turn using last Sync.@endTime and Sync.@startTime
109
for (def turn : trs.Episode.Section.Turn) {
110
	def t = turn.Sync
111
	if (t.size() == 0) continue;
112
	turn.@startTime = t[0].@time
113
	turn.@endTime = t[-1].@time
114
}
115

  
116
// fixing startTimes and endTimes of Section using last Turn.@endTime and Turn.@startTime
117
for (def section : trs.Episode.Section) {
118
	def t = section.Turn
119
	if (t.size() == 0) continue;
120
	section.@startTime = t[0].@startTime
121
	section.@endTime = t[-1].@endTime
122
}
123

  
124
outputTrsFile.withWriter("UTF-8") { writer ->
125
	writer.write('<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE Trans SYSTEM "trans-14.dtd">\n')
126
	new groovy.util.XmlNodePrinter(new PrintWriter(writer)).print(trs) }
127

  
128
return true;
129

  
130
// UTILS METHODS TO ACCES TIMES
131

  
132
def getStartTime(def node) {
133
	def ret = null;
134
	if (node == null) return "0.0"
135
	if (node.name() == null) return "0.0"
136
	switch(node.name()) {
137
		case "Turn":
138
		case "Section":
139
		//			println "Turn"
140
			ret = node.@startTime
141
			break
142
		case "Sync":
143
		//		println "Sync"
144
			ret = node.@time
145
			break
146
		default: break;
147
	}
148
	//println "getStartTime "+node.name()+" $ret"
149
	return ret
150
}
151

  
152
def setStartTime(def node, def value) {
153
	switch(node.name()) {
154
		case "Turn":
155
		case "Section":
156
			node.@startTime = ""+value
157
			break;
158

  
159
		case "Sync":
160
			return node.@time = ""+value
161
		default: break;
162
	}
163
}
164

  
165
def getEndTime(def node) {
166
	def ret = null;
167
	if (node == null) return "0.0"
168
	if (node.name() == null) return "0.0"
169
	switch(node.name()) {
170
		case "Turn":
171
		case "Section":
172
		//			println "Turn"
173
			ret = node.@endTime
174
			break
175
		case "Sync":
176
		//		println "Sync"
177
			ret = node.@time
178
			break
179
		default: break;
180
	}
181
	//println "getStartTime "+node.name()+" $ret"
182
	return ret
183
}
184

  
185
def setEndTime(def node, def value) {
186
	switch(node.name()) {
187
		case "Turn":
188
		case "Section":
189
			node.@endTime = ""+value
190
			break;
191

  
192
		case "Sync":
193
			return node.@time = ""+value
194
		default: break;
195
	}
196
}
197

  
198
def fixSyncTimes(def list, def start, def end) {
199
	println "Nfix: "+list.size()+" "+list
200

  
201
	def startf = Double.parseDouble(start)
202
	def endf = Double.parseDouble(end)
203
	def delta = (endf-startf)/list.size()
204
	println "start=$start end=$end delta=$delta"
205

  
206
	float c = startf;
207
	for (int i = 0 ; i < list.size() ; i++) {
208
		c += delta;
209
		list[i].@time = ""+c
210
	}
211
}
TXM/trunk/org.txm.groovy.core/src/groovy/org/txm/macro/transcription/RecodeSpeakersMacro.groovy (revision 3291)
25 25
@Field @Option(name="nameRegex", usage="Colonne de jointure de transcription", widget="String", required=true, def="")
26 26
def newName
27 27

  
28
if (!ParametersDialog.open(this)) return;
28 29

  
29 30
def cs = new RecodeSpeakers(trsFile, outputTrsFile, idRegex, nameRegex, newID, newName);
30 31

  

Formats disponibles : Unified diff