!7 sclass Entry { S fullLine, time, text, comments; } sclass FullSpeechLogAsTable extends DynObjectTable { start { dontPersist(); itemToMap = func(Entry a) -> Map { humanizeKeys(objectToMapExcept(a, 'fullLine)) }; setData(map(func(S line) -> Entry { makeEntry(line) }, scanLog(speechRecognitionLog()))); onSpeechRecognized_raw(voidfunc(S line) { add(makeEntry(line)) }); } Entry makeEntry(S line) { ret nu(Entry, fullLine := line, text := speechRecognitionLog_extractUtterance(line), time := localDateWithMillisecondsIfReasonable(parseLeadingLong(line))); } L getList() { ret syncCloneList(data); } L getTexts() { // Quick extraction L data = this.data; L l = emptyList(l(data)); if (data != null) synchronized(data) { for (Entry e : data) l.add(e.text); } ret l; } }