Skip to content

Commit

Permalink
TTS: split document into ranges of block elements
Browse files Browse the repository at this point in the history
  • Loading branch information
johnfactotum committed Sep 30, 2023
1 parent c382c28 commit 383d3c4
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 30 deletions.
31 changes: 15 additions & 16 deletions src/book-viewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -575,12 +575,12 @@ GObject.registerClass({
addAnnotation(x) { return this.#exec('reader.view.addAnnotation', x) }
deleteAnnotation(x) { return this.#exec('reader.view.deleteAnnotation', x) }
print() { return this.#exec('reader.print') }
initSpeech(x) { return this.#exec('reader.view.initSpeech', x) }
startSpeech(x) { return this.#exec('reader.view.startSpeech', x) }
seekSpeech(x) { return this.#exec('reader.view.seekSpeech', x) }
seekSpeechPaused(x) { return this.#exec('reader.view.seekSpeechPaused', x) }
resumeSpeech() { return this.#exec('reader.view.resumeSpeech') }
hightlightSpeechMark(x) { return this.#exec('reader.view.hightlightSpeechMark', x) }
initTTS(x) { return this.#exec('reader.view.initTTS', x) }
ttsStart() { return this.#exec('reader.view.tts.start') }
ttsPrev(x) { return this.#exec('reader.view.tts.prev', x) }
ttsNext(x) { return this.#exec('reader.view.tts.next', x) }
ttsResume() { return this.#exec('reader.view.tts.resume') }
ttsSetMark(x) { return this.#exec('reader.view.tts.setMark', x) }
getCover() { return this.#exec('reader.getCover').then(utils.base64ToPixbuf) }
init(x) { return this.#exec('reader.view.init', x) }
get webView() { return this.#webView }
Expand Down Expand Up @@ -814,15 +814,14 @@ export const BookViewer = GObject.registerClass({

// TTS
utils.connect(this._navbar.tts_box, {
'init': () => this._view.initSpeech('word'),
'start': () => this._view.startSpeech(),
'start-from': (_, mark) => this._view.startSpeech(mark),
'resume': () => this._view.resumeSpeech(),
'backward': () => this._view.seekSpeech(-1),
'forward': () => this._view.seekSpeech(1),
'backward-paused': () => this._view.seekSpeechPaused(-1),
'forward-paused': () => this._view.seekSpeechPaused(1),
'highlight': (_, mark) => this._view.hightlightSpeechMark(mark),
'init': () => this._view.initTTS(),
'start': () => this._view.ttsStart(),
'resume': () => this._view.ttsResume(),
'backward': () => this._view.ttsPrev(),
'forward': () => this._view.ttsNext(),
'backward-paused': () => this._view.ttsPrev(true),
'forward-paused': () => this._view.ttsNext(true),
'highlight': (_, mark) => this._view.ttsSetMark(mark),
// FIXME: check if at end
'next-section': () => this._view.next().then(() => true),
})
Expand Down Expand Up @@ -1053,7 +1052,7 @@ export const BookViewer = GObject.registerClass({
utils.setClipboardText(result, this.root)
}
else if (action === 'speak-from-here')
this._navbar.tts_box.startFrom(payload.mark)
this._navbar.tts_box.speak(payload.ssml)
}
#createOverlay({ index }) {
if (!this.#data) return
Expand Down
2 changes: 1 addition & 1 deletion src/foliate-js
Submodule foliate-js updated 6 files
+13 −1 README.md
+28 −18 epubcfi.js
+1 −1 paginator.js
+50 −18 tests/epubcfi-tests.js
+247 −28 tts.js
+5 −72 view.js
4 changes: 2 additions & 2 deletions src/reader/reader.js
Original file line number Diff line number Diff line change
Expand Up @@ -450,9 +450,9 @@ class Reader {
this.printRange(range.startContainer.ownerDocument, range)
break
case 'speak-from-here':
this.view.initSpeech('word').then(() => emit({
this.view.initTTS().then(() => emit({
type: 'selection', action,
mark: this.view.getSpeechMarkBefore(range),
ssml: this.view.tts.from(range),
}))
break
}
Expand Down
18 changes: 7 additions & 11 deletions src/tts.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@ export const TTSBox = GObject.registerClass({
Signals: {
'init': { return_type: GObject.TYPE_JSOBJECT },
'start': { return_type: GObject.TYPE_JSOBJECT },
'start-from': {
param_types: [GObject.TYPE_STRING],
return_type: GObject.TYPE_JSOBJECT,
},
'resume': { return_type: GObject.TYPE_JSOBJECT },
'backward': { return_type: GObject.TYPE_JSOBJECT },
'forward': { return_type: GObject.TYPE_JSOBJECT },
Expand Down Expand Up @@ -67,13 +63,18 @@ export const TTSBox = GObject.registerClass({
}
async #speak(ssml) {
this.state = 'playing'
const iter = await ssip.speak(await ssml)
ssml = await ssml
if (!ssml && await this.emit('next-section')) return this.forward()
const iter = await ssip.speak(ssml)
let state
for await (const { mark, message } of iter) {
if (mark) await this.emit('highlight', mark)
else state = message
}
if (state === 'END' && await this.emit('next-section')) this.start()
if (state === 'END') this.forward()
}
speak(ssml) {
this.#init().then(() => this.#speak(ssml)).catch(e => this.error(e))
}
play() {
if (this.#state !== 'playing') this.start()
Expand All @@ -86,11 +87,6 @@ export const TTSBox = GObject.registerClass({
: this.emit('start')))
.catch(e => this.error(e))
}
startFrom(mark) {
this.#init()
.then(() => this.#speak(this.emit('start-from', mark)))
.catch(e => this.error(e))
}
pause() {
this.state = 'paused'
ssip.stop().catch(e => this.error(e))
Expand Down

0 comments on commit 383d3c4

Please sign in to comment.