audio.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. type TTSPlayer = {
  2. init: () => void;
  3. play: (audioBuffer: ArrayBuffer, onended: () => void | null) => Promise<void>;
  4. stop: () => void;
  5. };
  6. export function createTTSPlayer(): TTSPlayer {
  7. let audioContext: AudioContext | null = null;
  8. let audioBufferSourceNode: AudioBufferSourceNode | null = null;
  9. const init = () => {
  10. audioContext = new (window.AudioContext || window.webkitAudioContext)();
  11. audioContext.suspend();
  12. };
  13. const play = async (audioBuffer: ArrayBuffer, onended: () => void | null) => {
  14. if (audioBufferSourceNode) {
  15. audioBufferSourceNode.stop();
  16. audioBufferSourceNode.disconnect();
  17. }
  18. const buffer = await audioContext!.decodeAudioData(audioBuffer);
  19. audioBufferSourceNode = audioContext!.createBufferSource();
  20. audioBufferSourceNode.buffer = buffer;
  21. audioBufferSourceNode.connect(audioContext!.destination);
  22. audioContext!.resume().then(() => {
  23. audioBufferSourceNode!.start();
  24. });
  25. audioBufferSourceNode.onended = onended;
  26. };
  27. const stop = () => {
  28. if (audioBufferSourceNode) {
  29. audioBufferSourceNode.stop();
  30. audioBufferSourceNode.disconnect();
  31. audioBufferSourceNode = null;
  32. }
  33. if (audioContext) {
  34. audioContext.close();
  35. audioContext = null;
  36. }
  37. };
  38. return { init, play, stop };
  39. }