Files
kiss-translator/src/hooks/Audio.js

62 lines
1.3 KiB
JavaScript
Raw Normal View History

2024-03-25 18:14:12 +08:00
import { useCallback, useEffect, useRef, useState } from "react";
import { apiBaiduTTS } from "../apis";
2024-03-25 21:00:39 +08:00
import { kissLog } from "../libs/log";
2024-03-25 18:14:12 +08:00
/**
* 声音播放hook
* @param {*} src
* @returns
*/
export function useAudio(src) {
const audioRef = useRef(null);
const [error, setError] = useState(null);
const [ready, setReady] = useState(false);
const [playing, setPlaying] = useState(false);
2024-03-25 21:00:39 +08:00
const onPlay = useCallback(() => {
2024-03-25 18:14:12 +08:00
audioRef.current?.play();
}, []);
useEffect(() => {
if (!src) {
return;
}
const audio = new Audio(src);
audio.addEventListener("error", (err) => setError(err));
audio.addEventListener("canplaythrough", () => setReady(true));
audio.addEventListener("play", () => setPlaying(true));
audio.addEventListener("ended", () => setPlaying(false));
audioRef.current = audio;
}, [src]);
return {
error,
ready,
playing,
2024-03-25 21:00:39 +08:00
onPlay,
2024-03-25 18:14:12 +08:00
};
}
2024-03-25 21:00:39 +08:00
/**
* 获取语音hook
* @param {*} text
* @param {*} lan
* @param {*} spd
* @returns
*/
2024-03-25 18:14:12 +08:00
export function useTextAudio(text, lan = "uk", spd = 3) {
const [src, setSrc] = useState("");
useEffect(() => {
(async () => {
2024-03-25 21:00:39 +08:00
try {
setSrc(await apiBaiduTTS(text, lan, spd));
} catch (err) {
kissLog(err, "baidu tts");
}
2024-03-25 18:14:12 +08:00
})();
}, [text, lan, spd]);
return useAudio(src);
}