alberdjuniawan commited on
Commit
1f0e8b3
·
1 Parent(s): bf3d799

refactor: add vav header

Browse files
Files changed (1) hide show
  1. 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 (g *GroqSTT) callGroqAPI(ctx context.Context, audioData []byte) (string, error) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 from file failed: %w", err)
40
  }
41
- part.Write(audioData)
42
 
43
  writer.WriteField("model", "whisper-large-v3")
44
  writer.WriteField("response_format", "json")
45
- //writer.WriteField("language", "id")
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"