Spaces:
Runtime error
Runtime error
Commit ·
1f0e8b3
1
Parent(s): bf3d799
refactor: add vav header
Browse files- service/groq_stt.go +33 -4
service/groq_stt.go
CHANGED
|
@@ -3,6 +3,7 @@ package service
|
|
| 3 |
import (
|
| 4 |
"bytes"
|
| 5 |
"context"
|
|
|
|
| 6 |
"encoding/json"
|
| 7 |
"fmt"
|
| 8 |
"io"
|
|
@@ -26,23 +27,51 @@ func (g *GroqSTT) TranscribeChunk(ctx context.Context, audio []byte) (string, er
|
|
| 26 |
return g.callGroqAPI(ctx, audio)
|
| 27 |
}
|
| 28 |
|
| 29 |
-
func (
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
if g.apiKey == "" {
|
| 31 |
return "", fmt.Errorf("API Key is empty")
|
| 32 |
}
|
| 33 |
|
|
|
|
|
|
|
| 34 |
body := &bytes.Buffer{}
|
| 35 |
writer := multipart.NewWriter(body)
|
| 36 |
|
| 37 |
part, err := writer.CreateFormFile("file", "audio.wav")
|
| 38 |
if err != nil {
|
| 39 |
-
return "", fmt.Errorf("create
|
| 40 |
}
|
| 41 |
-
part.Write(
|
| 42 |
|
| 43 |
writer.WriteField("model", "whisper-large-v3")
|
| 44 |
writer.WriteField("response_format", "json")
|
| 45 |
-
|
| 46 |
writer.Close()
|
| 47 |
|
| 48 |
url := "https://api.groq.com/openai/v1/audio/transcriptions"
|
|
|
|
| 3 |
import (
|
| 4 |
"bytes"
|
| 5 |
"context"
|
| 6 |
+
"encoding/binary"
|
| 7 |
"encoding/json"
|
| 8 |
"fmt"
|
| 9 |
"io"
|
|
|
|
| 27 |
return g.callGroqAPI(ctx, audio)
|
| 28 |
}
|
| 29 |
|
| 30 |
+
func addWavHeader(pcmData []byte) []byte {
|
| 31 |
+
const sampleRate = 16000
|
| 32 |
+
const numChannels = 1
|
| 33 |
+
const bitsPerSample = 16
|
| 34 |
+
|
| 35 |
+
header := new(bytes.Buffer)
|
| 36 |
+
|
| 37 |
+
header.WriteString("RIFF")
|
| 38 |
+
binary.Write(header, binary.LittleEndian, int32(36+len(pcmData)))
|
| 39 |
+
header.WriteString("WAVE")
|
| 40 |
+
|
| 41 |
+
header.WriteString("fmt ")
|
| 42 |
+
binary.Write(header, binary.LittleEndian, int32(16))
|
| 43 |
+
binary.Write(header, binary.LittleEndian, int16(1))
|
| 44 |
+
binary.Write(header, binary.LittleEndian, int16(numChannels))
|
| 45 |
+
binary.Write(header, binary.LittleEndian, int32(sampleRate))
|
| 46 |
+
binary.Write(header, binary.LittleEndian, int32(sampleRate*numChannels*bitsPerSample/8))
|
| 47 |
+
binary.Write(header, binary.LittleEndian, int16(numChannels*bitsPerSample/8))
|
| 48 |
+
binary.Write(header, binary.LittleEndian, int16(bitsPerSample))
|
| 49 |
+
|
| 50 |
+
header.WriteString("data")
|
| 51 |
+
binary.Write(header, binary.LittleEndian, int32(len(pcmData)))
|
| 52 |
+
|
| 53 |
+
return append(header.Bytes(), pcmData...)
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
func (g *GroqSTT) callGroqAPI(ctx context.Context, rawAudio []byte) (string, error) {
|
| 57 |
if g.apiKey == "" {
|
| 58 |
return "", fmt.Errorf("API Key is empty")
|
| 59 |
}
|
| 60 |
|
| 61 |
+
wavData := addWavHeader(rawAudio)
|
| 62 |
+
|
| 63 |
body := &bytes.Buffer{}
|
| 64 |
writer := multipart.NewWriter(body)
|
| 65 |
|
| 66 |
part, err := writer.CreateFormFile("file", "audio.wav")
|
| 67 |
if err != nil {
|
| 68 |
+
return "", fmt.Errorf("create form file failed: %w", err)
|
| 69 |
}
|
| 70 |
+
part.Write(wavData)
|
| 71 |
|
| 72 |
writer.WriteField("model", "whisper-large-v3")
|
| 73 |
writer.WriteField("response_format", "json")
|
| 74 |
+
writer.WriteField("language", "id")
|
| 75 |
writer.Close()
|
| 76 |
|
| 77 |
url := "https://api.groq.com/openai/v1/audio/transcriptions"
|