Merge pull request #1108 from omnivore-app/fix/failed-to-convert-speech

Fix some articles not converted to speech correctly
This commit is contained in:
Hongbo Wu 2022-08-22 12:58:04 +08:00 committed by GitHub
commit 4ce7352013
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -213,6 +213,14 @@ export const htmlElementToSsml = (
rate = 1,
volume = 100
): string => {
const replaceElement = (newElement: Element, oldElement: Element) => {
const id = oldElement.getAttribute('data-omnivore-anchor-idx')
if (id) {
const e = htmlElement.querySelector(`[data-omnivore-anchor-idx="${id}"]`)
e?.parentNode?.replaceChild(newElement, e)
}
}
const appendBookmarkElement = (parent: Element, element: Element) => {
const id = element.getAttribute('data-omnivore-anchor-idx')
if (id) {
@ -222,14 +230,23 @@ export const htmlElementToSsml = (
}
}
const replaceEmphasisElement = (element: Element, level: string) => {
const replaceWithEmphasis = (element: Element, level: string) => {
const parent = ssml.createDocumentFragment() as unknown as Element
appendBookmarkElement(parent, element)
const emphasisElement = ssml.createElement('emphasis')
emphasisElement.setAttribute('level', level)
emphasisElement.innerHTML = element.innerHTML.trim()
parent.appendChild(emphasisElement)
element?.parentNode?.replaceChild(parent, element)
replaceElement(parent, element)
}
const replaceWithSentence = (element: Element) => {
const parent = ssml.createDocumentFragment() as unknown as Element
appendBookmarkElement(parent, element)
const sentenceElement = ssml.createElement('s')
sentenceElement.innerHTML = element.innerHTML.trim()
parent.appendChild(sentenceElement)
replaceElement(parent, element)
}
// create new ssml document
@ -251,11 +268,11 @@ export const htmlElementToSsml = (
htmlElement.querySelectorAll('*').forEach((e) => {
switch (e.tagName.toLowerCase()) {
case 's':
replaceEmphasisElement(e, 'reduced')
replaceWithEmphasis(e, 'moderate')
break
case 'sub':
if (e.getAttribute('alias') === null) {
replaceEmphasisElement(e, 'reduced')
replaceWithEmphasis(e, 'moderate')
}
break
case 'i':
@ -269,28 +286,33 @@ export const htmlElementToSsml = (
case 'summary':
case 'caption':
case 'figcaption':
replaceEmphasisElement(e, 'reduced')
replaceWithEmphasis(e, 'moderate')
break
case 'b':
case 'strong':
case 'dt':
case 'dfn':
case 'u':
case 'li':
case 'mark':
case 'th':
case 'title':
case 'var':
replaceEmphasisElement(e, 'moderate')
replaceWithEmphasis(e, 'moderate')
break
case 'li':
replaceWithSentence(e)
break
default: {
const parent = ssml.createDocumentFragment() as unknown as Element
appendBookmarkElement(parent, e)
const text = (e as HTMLElement).innerText.trim()
const textElement = ssml.createTextNode(text)
e.parentNode?.replaceChild(textElement, e)
parent.appendChild(textElement)
replaceElement(parent, e)
}
}
})
prosodyElement.appendChild(htmlElement)
return speakElement.outerHTML.replace(/ /g, '')
return speakElement.outerHTML.replace(/ |\n/g, '')
}