Improved recognition display

This commit is contained in:
2020-02-01 01:03:02 +00:00
parent 4c25fccc86
commit 7d2b11473b
4 changed files with 123 additions and 59 deletions

View File

@@ -1012,16 +1012,17 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
newbook.setComment(info.getComment().trim()); newbook.setComment(info.getComment().trim());
newbook.setACX(info.getACX().trim()); newbook.setACX(info.getACX().trim());
Chapter caud = new Chapter("audition", "Audition"); Chapter caud = new Chapter(UUID.randomUUID().toString(), "Audition");
Chapter copen = new Chapter("open", "Opening Credits"); Chapter copen = new Chapter(UUID.randomUUID().toString(), "Opening Credits");
Chapter cone = new Chapter("0001", "Chapter 1"); Chapter cclose = new Chapter(UUID.randomUUID().toString(), "Closing Credits");
Chapter cclose = new Chapter("close", "Closing Credits"); Chapter cone = new Chapter(UUID.randomUUID().toString(), "Chapter 1");
newbook.add(caud); newbook.add(caud);
newbook.add(copen); newbook.add(copen);
newbook.add(cone);
newbook.add(cclose); newbook.add(cclose);
newbook.add(cone);
File bookRoot = new File(Options.get("path.storage"), newbook.getName()); File bookRoot = new File(Options.get("path.storage"), newbook.getName());
if (!bookRoot.exists()) { if (!bookRoot.exists()) {
bookRoot.mkdirs(); bookRoot.mkdirs();
@@ -1030,6 +1031,10 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
File xml = new File(bookRoot, "audiobook.abx"); File xml = new File(bookRoot, "audiobook.abx");
Document doc = newbook.buildDocument(); Document doc = newbook.buildDocument();
File backup = new File(bookRoot, "audiobook.bak");
if (xml.exists()) {
xml.renameTo(backup);
}
// write the content into xml file // write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance(); TransformerFactory transformerFactory = TransformerFactory.newInstance();
@@ -1127,7 +1132,10 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
Sentence snt = (Sentence)s.nextElement(); Sentence snt = (Sentence)s.nextElement();
if (!snt.isLocked()) { if (!snt.isLocked()) {
if (snt.getId().equals(snt.getText())) { if (snt.getId().equals(snt.getText())) {
snt.doRecognition(); Runnable r = snt.getRecognitionRunnable();
snt.setQueued();
speechProcessQueue.add(r);
speechProcessQueue.notify();
} }
} }
} }
@@ -1477,20 +1485,11 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
Chapter chap = (Chapter)o.getObject(); Chapter chap = (Chapter)o.getObject();
int pos = bookTreeModel.getIndexOfChild(book, chap); int pos = bookTreeModel.getIndexOfChild(book, chap);
if (pos > 0) pos--; if (pos > 0) pos--;
int id = Utils.s2i(chap.getId());
if (id > 0) {
Chapter prevChap = (Chapter)bookTreeModel.getChild(book, pos); Chapter prevChap = (Chapter)bookTreeModel.getChild(book, pos);
id = Utils.s2i(prevChap.getId());
if (id > 0) {
bookTreeModel.removeNodeFromParent(chap); bookTreeModel.removeNodeFromParent(chap);
bookTreeModel.insertNodeInto(chap, book, pos); bookTreeModel.insertNodeInto(chap, book, pos);
} }
}
book.renumberChapters();
}
}); });
moveUp.setEnabled(idNumber > 0);
JMenuObject moveDown = new JMenuObject("Move Down", c, new ActionListener() { JMenuObject moveDown = new JMenuObject("Move Down", c, new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
@@ -1499,21 +1498,13 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
Chapter chap = (Chapter)o.getObject(); Chapter chap = (Chapter)o.getObject();
int pos = bookTreeModel.getIndexOfChild(book, chap); int pos = bookTreeModel.getIndexOfChild(book, chap);
pos++; pos++;
int id = Utils.s2i(chap.getId());
if (id > 0) {
Chapter nextChap = (Chapter)bookTreeModel.getChild(book, pos); Chapter nextChap = (Chapter)bookTreeModel.getChild(book, pos);
if (nextChap != null) { if (nextChap != null) {
id = Utils.s2i(nextChap.getId());
if (id > 0) {
bookTreeModel.removeNodeFromParent(chap); bookTreeModel.removeNodeFromParent(chap);
bookTreeModel.insertNodeInto(chap, book, pos); bookTreeModel.insertNodeInto(chap, book, pos);
} }
} }
}
book.renumberChapters();
}
}); });
moveDown.setEnabled(idNumber > 0);
JMenu mergeWith = new JMenu("Merge chapter with"); JMenu mergeWith = new JMenu("Merge chapter with");
for (Enumeration bc = book.children(); bc.hasMoreElements();) { for (Enumeration bc = book.children(); bc.hasMoreElements();) {
@@ -1607,10 +1598,11 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
for (Enumeration s = c.children(); s.hasMoreElements();) { for (Enumeration s = c.children(); s.hasMoreElements();) {
Sentence snt = (Sentence)s.nextElement(); Sentence snt = (Sentence)s.nextElement();
if (!snt.isLocked()) { if (!snt.isLocked()) {
if (snt.getId().equals(snt.getText())) { if (!snt.beenDetected()) {
Debug.d("Queueing recognition of", snt.getId()); Debug.d("Queueing recognition of", snt.getId());
synchronized(speechProcessQueue) { synchronized(speechProcessQueue) {
Runnable r = snt.getRecognitionRunnable(); Runnable r = snt.getRecognitionRunnable();
snt.setQueued();
speechProcessQueue.add(r); speechProcessQueue.add(r);
speechProcessQueue.notify(); speechProcessQueue.notify();
} }
@@ -2241,6 +2233,8 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
gatherOrphans();
} }
public void loadBookStructure(File f) { public void loadBookStructure(File f) {
@@ -4089,4 +4083,47 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
// DocumentListener *// // DocumentListener *//
public boolean sentenceIdExists(String id) {
for (Enumeration c = book.children(); c.hasMoreElements();) {
Chapter chp = (Chapter)c.nextElement();
for (Enumeration s = chp.children(); s.hasMoreElements();) {
Sentence snt = (Sentence)s.nextElement();
if (snt.getId().equals(id)) return true;
}
}
return false;
}
public void gatherOrphans() {
Chapter orphans = getChapterById("orphans");
if (orphans == null) {
orphans = new Chapter("orphans", "Orphan Files");
bookTreeModel.insertNodeInto(orphans, book, book.getChildCount());
}
File bookRoot = new File(Options.get("path.storage"), book.getName());
File[] files = new File(bookRoot, "files").listFiles();
for (File f : files) {
String filename = f.getName();
if (filename.startsWith(".")) continue;
if (filename.startsWith("backup")) continue;
if (filename.equals("room-noise")) continue;
if (filename.endsWith(".wav")) {
String id = filename.substring(0, filename.length() - 4);
Debug.d("Testing orphanicity of", id);
if (!sentenceIdExists(id)) {
Sentence newSentence = new Sentence(id, id);
bookTreeModel.insertNodeInto(newSentence, orphans, orphans.getChildCount());
}
}
}
}
public Chapter getChapterById(String id) {
for (Enumeration c = book.children(); c.hasMoreElements();) {
Chapter chp = (Chapter)c.nextElement();
if (chp.getId().equals(id)) return chp;
}
return null;
}
} }

View File

@@ -168,18 +168,8 @@ public class Book extends BookTreeNode {
public Chapter addChapter() { public Chapter addChapter() {
Debug.trace(); Debug.trace();
Chapter lc = getLastChapter(); String uuid = UUID.randomUUID().toString();
if (lc == null) return new Chapter("1", "Chapter 1"); return new Chapter(uuid, uuid);
try {
int lcid = Integer.parseInt(lc.getId());
lcid++;
Chapter nc = new Chapter(String.format("%04d", lcid), "Chapter " + lcid);
return nc;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} }
public String getName() { public String getName() {

View File

@@ -81,29 +81,37 @@ public class BookTreeRenderer extends DefaultTreeCellRenderer {
ctx.gridx = 0; ctx.gridx = 0;
ctx.gridy = 0; ctx.gridy = 0;
ctx.weightx = 1.0d;
ctx.fill = GridBagConstraints.HORIZONTAL; ctx.fill = GridBagConstraints.HORIZONTAL;
ctx.anchor = GridBagConstraints.LINE_START; ctx.anchor = GridBagConstraints.LINE_START;
p.add(ret, ctx);
String effectChain = s.getEffectChain(); if (s.isDetecting()) {
if ((effectChain == null) || (effectChain.equals("none"))) { JLabel eff = new JLabel(" recognising... ");
ctx.weightx = 1.0d;
ctx.gridwidth = 2;
p.add(ret, ctx);
} else {
ctx.weightx = 1.0d;
ctx.gridwidth = 1;
p.add(ret, ctx);
Effect e = AudiobookRecorder.window.effects.get(effectChain);
JLabel eff = new JLabel(e.toString() + " ");
ctx.weightx = 0.0d; ctx.weightx = 0.0d;
ctx.gridwidth = 1;
ctx.gridx = 1; ctx.gridx = 1;
p.add(eff); p.add(eff);
} else if (s.isQueued()) {
JLabel eff = new JLabel(" queued ");
ctx.weightx = 0.0d;
ctx.gridx = 1;
p.add(eff);
} else if (s.isQueued()) {
} }
ctx.gridwidth = 1; String effectChain = s.getEffectChain();
if ((effectChain != null) && (!effectChain.equals("none"))) {
Effect e = AudiobookRecorder.window.effects.get(effectChain);
if (e != null) {
JLabel eff = new JLabel(e.toString() + " ");
ctx.weightx = 0.0d; ctx.weightx = 0.0d;
ctx.gridx = 2; ctx.gridx = 2;
p.add(eff);
}
}
ctx.weightx = 0.0d;
ctx.gridx = 3;
ctx.anchor = GridBagConstraints.LINE_END; ctx.anchor = GridBagConstraints.LINE_END;
int peak = s.getPeakDB(); int peak = s.getPeakDB();
JLabel peakLabel = new JLabel(peak + "dB "); JLabel peakLabel = new JLabel(peak + "dB ");
@@ -113,7 +121,7 @@ public class BookTreeRenderer extends DefaultTreeCellRenderer {
p.add(peakLabel, ctx); p.add(peakLabel, ctx);
ctx.weightx = 0.0d; ctx.weightx = 0.0d;
ctx.gridx = 3; ctx.gridx = 4;
ctx.anchor = GridBagConstraints.LINE_END; ctx.anchor = GridBagConstraints.LINE_END;
p.add(time, ctx); p.add(time, ctx);

View File

@@ -59,6 +59,9 @@ public class Sentence extends BookTreeNode implements Cacheable {
boolean inSample; boolean inSample;
boolean attention = false; boolean attention = false;
boolean processed = false; boolean processed = false;
boolean isDetected = false;
boolean detecting = false;
boolean queued = false;
String effectChain = null; String effectChain = null;
@@ -204,6 +207,10 @@ public class Sentence extends BookTreeNode implements Cacheable {
processed = Utils.s2b(Book.getTextNode(root, "processed")); processed = Utils.s2b(Book.getTextNode(root, "processed"));
runtime = Utils.s2d(Book.getTextNode(root, "time", "-1.000")); runtime = Utils.s2d(Book.getTextNode(root, "time", "-1.000"));
peak = Utils.s2d(Book.getTextNode(root, "peak", "-1.000")); peak = Utils.s2d(Book.getTextNode(root, "peak", "-1.000"));
isDetected = Utils.s2b(Book.getTextNode(root, "detected"));
if (text == null) text = id;
if (text.equals("")) text = id;
if ((crossStartOffset == -1) || (crossEndOffset == -1)) { if ((crossStartOffset == -1) || (crossEndOffset == -1)) {
updateCrossings(true); updateCrossings(true);
@@ -497,6 +504,7 @@ public class Sentence extends BookTreeNode implements Cacheable {
public String getText() { public String getText() {
Debug.trace(); Debug.trace();
if (text == null) return id;
return text; return text;
} }
@@ -693,8 +701,9 @@ public class Sentence extends BookTreeNode implements Cacheable {
public void doRecognition() { public void doRecognition() {
Debug.trace(); Debug.trace();
detecting = true;
queued = false;
try { try {
setText("[recognising...]");
reloadTree(); reloadTree();
String command = Options.get("process.command"); String command = Options.get("process.command");
@@ -712,10 +721,13 @@ public class Sentence extends BookTreeNode implements Cacheable {
} }
setText(res); setText(res);
isDetected = true;
detecting = false;
reloadTree(); reloadTree();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
detecting = false;
} }
public void recognise() { public void recognise() {
@@ -1502,6 +1514,7 @@ public class Sentence extends BookTreeNode implements Cacheable {
public void setEffectChain(String key) { public void setEffectChain(String key) {
Debug.trace(); Debug.trace();
if (key == null) key = "none";
if ((effectChain != null) && (effectChain.equals(key))) { if ((effectChain != null) && (effectChain.equals(key))) {
return; return;
} }
@@ -1618,6 +1631,7 @@ public class Sentence extends BookTreeNode implements Cacheable {
sentenceNode.appendChild(Book.makeTextNode(doc, "notes", getNotes())); sentenceNode.appendChild(Book.makeTextNode(doc, "notes", getNotes()));
sentenceNode.appendChild(Book.makeTextNode(doc, "time", getLength())); sentenceNode.appendChild(Book.makeTextNode(doc, "time", getLength()));
sentenceNode.appendChild(Book.makeTextNode(doc, "peak", getPeak())); sentenceNode.appendChild(Book.makeTextNode(doc, "peak", getPeak()));
sentenceNode.appendChild(Book.makeTextNode(doc, "detected", beenDetected()));
return sentenceNode; return sentenceNode;
} }
@@ -1688,5 +1702,20 @@ public class Sentence extends BookTreeNode implements Cacheable {
return (int)db; return (int)db;
} }
public boolean isDetecting() {
return detecting;
}
public boolean beenDetected() {
return isDetected;
}
public boolean isQueued() {
return queued;
}
public void setQueued() {
queued = true;
}
} }