| | |
| | | |
| | | type sherpaEngine struct { |
| | | recognizer *sherpa.OfflineRecognizer |
| | | provider string |
| | | hwInfo string |
| | | } |
| | | |
| | |
| | | logger.Info("Engine initialized: %s", info) |
| | | return &sherpaEngine{ |
| | | recognizer: recognizer, |
| | | provider: "cpu", |
| | | hwInfo: info, |
| | | }, nil |
| | | } |
| | |
| | | } |
| | | |
| | | func (e *sherpaEngine) Recognize(samples []float32) (string, error) { |
| | | totalStart := time.Now() |
| | | streamStart := time.Now() |
| | | stream := sherpa.NewOfflineStream(e.recognizer) |
| | | streamMS := durationMS(time.Since(streamStart)) |
| | | defer sherpa.DeleteOfflineStream(stream) |
| | | |
| | | acceptStart := time.Now() |
| | | stream.AcceptWaveform(16000, samples) |
| | | acceptMS := durationMS(time.Since(acceptStart)) |
| | | |
| | | decodeStart := time.Now() |
| | | e.recognizer.Decode(stream) |
| | | decodeMS := durationMS(time.Since(decodeStart)) |
| | | resultStart := time.Now() |
| | | result := stream.GetResult() |
| | | resultMS := durationMS(time.Since(resultStart)) |
| | | logger.Info( |
| | | "PERF engine_recognize_detail backend=%q provider=%q engine=%q samples=%d audio_ms=%d create_stream_ms=%d accept_ms=%d decode_ms=%d result_ms=%d total_ms=%d", |
| | | model.BackendSenseVoice, |
| | | e.provider, |
| | | e.hwInfo, |
| | | len(samples), |
| | | audioDurationMS(samples), |
| | | streamMS, |
| | | acceptMS, |
| | | decodeMS, |
| | | resultMS, |
| | | durationMS(time.Since(totalStart)), |
| | | ) |
| | | |
| | | return result.Text, nil |
| | | } |
| | |
| | | return e.hwInfo |
| | | } |
| | | |
| | | func (e *sherpaEngine) Provider() string { |
| | | return e.provider |
| | | } |
| | | |
| | | func (e *sherpaEngine) ReleaseTailCaptureDelay() time.Duration { |
| | | return senseVoiceReleaseTailDelay |
| | | } |