71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
//go:build extra
|
|
// +build extra
|
|
|
|
package extra
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"gf-lt/config"
|
|
"io"
|
|
"log/slog"
|
|
"regexp"
|
|
)
|
|
|
|
var specialRE = regexp.MustCompile(`\[.*?\]`)
|
|
|
|
type STT interface {
|
|
StartRecording() error
|
|
StopRecording() (string, error)
|
|
IsRecording() bool
|
|
}
|
|
|
|
type StreamCloser interface {
|
|
Close() error
|
|
}
|
|
|
|
func NewSTT(logger *slog.Logger, cfg *config.Config) STT {
|
|
switch cfg.STT_TYPE {
|
|
case "WHISPER_BINARY":
|
|
logger.Debug("stt init, chosen whisper binary")
|
|
return NewWhisperBinary(logger, cfg)
|
|
case "WHISPER_SERVER":
|
|
logger.Debug("stt init, chosen whisper server")
|
|
return NewWhisperServer(logger, cfg)
|
|
}
|
|
return NewWhisperServer(logger, cfg)
|
|
}
|
|
|
|
func NewWhisperServer(logger *slog.Logger, cfg *config.Config) *WhisperServer {
|
|
return &WhisperServer{
|
|
logger: logger,
|
|
ServerURL: cfg.STT_URL,
|
|
SampleRate: cfg.STT_SR,
|
|
AudioBuffer: new(bytes.Buffer),
|
|
}
|
|
}
|
|
|
|
func (stt *WhisperServer) writeWavHeader(w io.Writer, dataSize int) {
|
|
header := make([]byte, 44)
|
|
copy(header[0:4], "RIFF")
|
|
binary.LittleEndian.PutUint32(header[4:8], uint32(36+dataSize))
|
|
copy(header[8:12], "WAVE")
|
|
copy(header[12:16], "fmt ")
|
|
binary.LittleEndian.PutUint32(header[16:20], 16)
|
|
binary.LittleEndian.PutUint16(header[20:22], 1)
|
|
binary.LittleEndian.PutUint16(header[22:24], 1)
|
|
binary.LittleEndian.PutUint32(header[24:28], uint32(stt.SampleRate))
|
|
binary.LittleEndian.PutUint32(header[28:32], uint32(stt.SampleRate)*1*(16/8))
|
|
binary.LittleEndian.PutUint16(header[32:34], 1*(16/8))
|
|
binary.LittleEndian.PutUint16(header[34:36], 16)
|
|
copy(header[36:40], "data")
|
|
binary.LittleEndian.PutUint32(header[40:44], uint32(dataSize))
|
|
if _, err := w.Write(header); err != nil {
|
|
stt.logger.Error("writeWavHeader", "error", err)
|
|
}
|
|
}
|
|
|
|
func (stt *WhisperServer) IsRecording() bool {
|
|
return stt.recording
|
|
}
|