package api import ( "fmt" "net/http" "strings" "go-whisper-api/config" "go-whisper-api/whisper" ) type sttOptions struct { language string punctuate bool speakers bool numClusters int } func (s *Server) parseSTTOptions(r *http.Request) (sttOptions, error) { opts := sttOptions{ language: resolveLanguage(r, s.cfg.Language), punctuate: s.punctCfg.ShouldApplyAPI(r, s.cfg.DefaultPunctuation), } sp, clusters, err := querySpeakers(r, s.cfg.DefaultSpeakers, s.diarCfg, s.diarizer.Active()) if err != nil { return opts, err } opts.speakers = sp opts.numClusters = clusters return opts, nil } func resolveLanguage(r *http.Request, defaultLang string) string { if v := strings.TrimSpace(r.URL.Query().Get("language")); v != "" { return v } return strings.TrimSpace(defaultLang) } func querySpeakers(r *http.Request, defaultOn bool, dc config.Diarization, diarizerActive bool) (enabled bool, numClusters int, err error) { counter := queryInt(r, "speaker_counter", -999) if counter == -1 { return false, 0, nil } speakersQ := r.URL.Query().Get("speakers") enabled = defaultOn if speakersQ != "" { enabled = queryInt(r, "speakers", 0) == 1 } if !enabled { return false, 0, nil } if !dc.Active() { return false, 0, fmt.Errorf("speaker diarization is disabled in config (diarization.enabled: true)") } if !diarizerActive { return false, 0, fmt.Errorf("speaker diarization requires server built with -tags sherpa (make build-sherpa) and models (make download-diarization-models)") } if counter > 0 { numClusters = counter } else if dc.NumClusters > 0 { numClusters = dc.NumClusters } return true, numClusters, nil } func (s *Server) whisperRunOpts(stt sttOptions, turns []whisper.Turn) whisper.RunOptions { t := s.cfg.Transcript.WithDefaults() return whisper.RunOptions{ Turns: turns, Format: whisper.FormatOptions{ PauseGap: t.PauseGapDuration(), SpeakerLabel: t.SpeakerLabel, UseSpeakers: stt.speakers && len(turns) > 0, }, } }