Spaces:
Running
Running
| import { HUGGINGFACE_API_KEY } from "../api.js"; | |
| export class SpeechToTextClient { | |
| constructor() { | |
| this.apiKey = HUGGINGFACE_API_KEY; | |
| this.isRecording = false; | |
| this.mediaRecorder = null; | |
| this.audioChunks = []; | |
| } | |
| async startRecording() { | |
| try { | |
| const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); | |
| this.mediaRecorder = new MediaRecorder(stream); | |
| this.audioChunks = []; | |
| this.mediaRecorder.ondataavailable = (event) => { | |
| this.audioChunks.push(event.data); | |
| }; | |
| this.mediaRecorder.start(); | |
| this.isRecording = true; | |
| } catch (error) { | |
| console.error("Error starting recording:", error); | |
| throw error; | |
| } | |
| } | |
| async stopRecording() { | |
| return new Promise((resolve, reject) => { | |
| this.mediaRecorder.onstop = async () => { | |
| try { | |
| const audioBlob = new Blob(this.audioChunks, { type: "audio/webm" }); | |
| const result = await this.transcribeAudio(audioBlob); | |
| resolve(result); | |
| } catch (error) { | |
| reject(error); | |
| } | |
| }; | |
| this.mediaRecorder.stop(); | |
| this.isRecording = false; | |
| this.mediaRecorder.stream.getTracks().forEach((track) => track.stop()); | |
| }); | |
| } | |
| async transcribeAudio(audioBlob) { | |
| try { | |
| const response = await fetch("https://q86j6jmwc3jujazp.us-east-1.aws.endpoints.huggingface.cloud", { | |
| headers: { | |
| Accept: "application/json", | |
| Authorization: `Bearer ${this.apiKey}`, | |
| "Content-Type": "audio/webm", | |
| }, | |
| method: "POST", | |
| body: audioBlob, | |
| }); | |
| const result = await response.json(); | |
| return result; | |
| } catch (error) { | |
| console.error("Error transcribing audio:", error); | |
| throw error; | |
| } | |
| } | |
| } | |