1 package org.daisy.pipeline.tts.config;
2
3 import java.net.URI;
4 import java.util.ArrayList;
5 import java.util.Collection;
6 import java.util.Map;
7
8 import net.sf.saxon.s9api.QName;
9 import net.sf.saxon.s9api.XdmNode;
10
11 import org.daisy.pipeline.tts.VoiceInfo;
12 import org.daisy.pipeline.tts.VoiceInfo.Gender;
13 import org.daisy.pipeline.tts.config.ConfigReader;
14
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
18 public class VoiceConfigExtension implements ConfigReader.Extension {
19
20 private static final Logger logger = LoggerFactory.getLogger(VoiceConfigExtension.class);
21
22 @Override
23 public boolean parseNode(XdmNode node, URI documentURI, ConfigReader parent) {
24 String name = node.getNodeName().getLocalName();
25 if ("voice".equalsIgnoreCase(name)) {
26 String lang = node.getAttributeValue(new QName(null, "lang"));
27 if (lang == null)
28 node.getAttributeValue(new QName("http://www.w3.org/XML/1998/namespace", "lang"));
29 String vengine = node.getAttributeValue(new QName(null, "engine"));
30 String vname = node.getAttributeValue(new QName(null, "name"));
31 String priority = node.getAttributeValue(new QName(null, "priority"));
32 Gender gender = Gender.of(node.getAttributeValue(new QName(null, "gender")));
33 if (node.getAttributeValue(new QName(null, "marks")) != null) {
34 logger.warn("mark attribute on voice is deprecated");
35 }
36
37 if (priority == null)
38 priority = "5";
39 if (lang == null || vengine == null || vname == null || gender == null) {
40 logger.warn("Config file invalid near " + node.toString());
41 } else {
42 try {
43 mVoices.add(new VoiceInfo(vengine, vname, lang, gender, Float.valueOf(priority)));
44 } catch (NumberFormatException e) {
45 logger.warn("Error while converting config file's priority " + priority
46 + " to float.");
47 } catch (IllegalArgumentException e) {
48 logger.warn("Invalid language in config file: " + lang);
49 logger.debug("Invalid language in config file: " + lang, e);
50 }
51 }
52 return true;
53 }
54 return false;
55 }
56
57 public Collection<VoiceInfo> getVoiceDeclarations() {
58 return mVoices;
59 }
60
61 private Collection<VoiceInfo> mVoices = new ArrayList<VoiceInfo>();
62 }