【发布时间】:2020-04-18 13:49:38
【问题描述】:
我正在一个 react 应用程序中创建一个文本到语音的功能,该功能可以通过在其后面添加背景来突出显示当前所说的单词。
该功能与Firefox reader view非常相似。
我实施的解决方案只是在每次渲染时剪切段落字符串并在口语单词周围放置一个跨度,这使得它占用大量资源并且无法制作动画。
这是代码:(我打算废弃)
export interface SpeakEvent {
start: number;
end: number;
type: string;
}
export default function TextNode({ content }: TextNodeProps) {
const [highlight, setHighlight] = useState<SpeakEvent | null>(null);
useEffect(() => {
registerText((ev) => {
if (ev?.type === 'word' || !ev)
setHighlight((old) => {
/* Irrelevant code */
return ev;
});
}, content);
}, [content]);
const { start, end } = highlight ?? {};
let segments = [content];
if (highlight) {
segments = [
segments[0].slice(0, start),
segments[0].slice(start, end),
segments[0].slice(end),
];
}
return (
<>
{segments.map((seg, i) =>
i === 1 ? (
<span key={i} className={'highlight'}>
{seg}
</span>
) : (
seg
)
)}
</>
);
}
Firefox 阅读器正在使用一种更智能的方式来执行此操作。它使用放置在口语后面的 div,然后是 moved around :
包含高亮效果的div直接使用绝对坐标放置。
他们如何在只知道字符串索引的情况下访问段落中单词的边界矩形?
【问题讨论】:
-
这能回答你的问题吗? Calculate text width with JavaScript
-
此解决方案似乎不适用于多行段落
标签: javascript html css reactjs text-to-speech