浏览器自带 TTS 能力。

:::info SpeechSynthesis 是一个 JavaScript API 的名称,用于合成语音。它是 Web Audio API 的一部分,允许开发者在网页上实时合成语音。SpeechSynthesis 使用 Text-to-Speech 技术来将文本转换为语音,可以将文本转换为不同的语言和声音。

SpeechSynthesis 的主要方法有以下几种:

  1. speak() - 用于合成语音。可以提供一段文本,以及一些 Optional 的参数,如语言、声音、音速、音高等。
  2. pause() - 用于暂停语音合成。
  3. resume() - 用于继续语音合成。
  4. cancel() - 用于取消语音合成。

例如,以下代码使用 SpeechSynthesis 合成了一段文本的语音:

:::

  1. const synth = window.speechSynthesis;
  2. synth.speak('Hello, world!', {
  3. language: 'en-US',
  4. voice: 'slt_kevin',
  5. speed: 1,
  6. pitch: 1
  7. });

:::info 在上面的代码中,我们使用 speak() 方法将文本「Hello, world!」进行合成,并指定了语言、声音、音速和音高。

需要注意的是,SpeechSynthesis 的支持度不 uniform,不同的浏览器和操作系统可能支持不同的语言和声音。同时,SpeechSynthesis 也可能会受到用户的语言和地区设置的影响。

:::

示例 Hook

  1. import { useCallback,useState } from "react";
  2. export const useSpeachSynthesisApi = () => {
  3. const [text, setText] = useState<string>("");
  4. const [isSpeaking, setIsSpeaking] = useState<boolean>(false);
  5. const [isPaused, setIsPaused] = useState<boolean>(false);
  6. const [isResumed, setIsResumed] = useState<boolean>(false);
  7. const [isEnded, setIsEnded] = useState<boolean>(false);
  8. const speak = useCallback(() => {
  9. var msg = new SpeechSynthesisUtterance();
  10. msg.text = <string>text;
  11. function speak() {
  12. window.speechSynthesis.speak(msg);
  13. }
  14. speak();
  15. setIsSpeaking(true);
  16. setIsEnded(false);
  17. }, [text]);
  18. const pause = useCallback(() => {
  19. function pause() {
  20. window.speechSynthesis.pause();
  21. }
  22. pause();
  23. setIsPaused(true);
  24. setIsSpeaking(false);
  25. setIsEnded(false);
  26. setIsResumed(false);
  27. }, []);
  28. const resume = useCallback(() => {
  29. function resume() {
  30. window.speechSynthesis.resume();
  31. }
  32. resume();
  33. setIsPaused(false);
  34. setIsSpeaking(false);
  35. setIsEnded(false);
  36. setIsResumed(true);
  37. }, []);
  38. const cancel = useCallback(() => {
  39. function cancel() {
  40. window.speechSynthesis.cancel();
  41. }
  42. cancel();
  43. setIsPaused(false);
  44. setIsResumed(false);
  45. setIsSpeaking(false);
  46. setIsEnded(true);
  47. }, []);
  48. return {
  49. text,
  50. setText,
  51. isSpeaking,
  52. isPaused,
  53. isResumed,
  54. isEnded,
  55. speak,
  56. pause,
  57. resume,
  58. cancel
  59. }
  60. }