Spaces:
Sleeping
Sleeping
package whisper | |
import ( | |
"fmt" | |
"os" | |
"runtime" | |
// Bindings | |
whisper "github.com/ggerganov/whisper.cpp/bindings/go" | |
) | |
/////////////////////////////////////////////////////////////////////////////// | |
// TYPES | |
type model struct { | |
path string | |
ctx *whisper.Context | |
} | |
// Make sure model adheres to the interface | |
var _ Model = (*model)(nil) | |
/////////////////////////////////////////////////////////////////////////////// | |
// LIFECYCLE | |
func New(path string) (Model, error) { | |
model := new(model) | |
if _, err := os.Stat(path); err != nil { | |
return nil, err | |
} else if ctx := whisper.Whisper_init(path); ctx == nil { | |
return nil, ErrUnableToLoadModel | |
} else { | |
model.ctx = ctx | |
model.path = path | |
} | |
// Return success | |
return model, nil | |
} | |
func (model *model) Close() error { | |
if model.ctx != nil { | |
model.ctx.Whisper_free() | |
} | |
// Release resources | |
model.ctx = nil | |
// Return success | |
return nil | |
} | |
/////////////////////////////////////////////////////////////////////////////// | |
// STRINGIFY | |
func (model *model) String() string { | |
str := "<whisper.model" | |
if model.ctx != nil { | |
str += fmt.Sprintf(" model=%q", model.path) | |
} | |
return str + ">" | |
} | |
/////////////////////////////////////////////////////////////////////////////// | |
// PUBLIC METHODS | |
// Return true if model is multilingual (language and translation options are supported) | |
func (model *model) IsMultilingual() bool { | |
return model.ctx.Whisper_is_multilingual() != 0 | |
} | |
// Return all recognized languages. Initially it is set to auto-detect | |
func (model *model) Languages() []string { | |
result := make([]string, 0, whisper.Whisper_lang_max_id()) | |
for i := 0; i < whisper.Whisper_lang_max_id(); i++ { | |
str := whisper.Whisper_lang_str(i) | |
if model.ctx.Whisper_lang_id(str) >= 0 { | |
result = append(result, str) | |
} | |
} | |
return result | |
} | |
func (model *model) NewContext() (Context, error) { | |
if model.ctx == nil { | |
return nil, ErrInternalAppError | |
} | |
// Create new context | |
params := model.ctx.Whisper_full_default_params(whisper.SAMPLING_GREEDY) | |
params.SetTranslate(false) | |
params.SetPrintSpecial(false) | |
params.SetPrintProgress(false) | |
params.SetPrintRealtime(false) | |
params.SetPrintTimestamps(false) | |
params.SetThreads(runtime.NumCPU()) | |
params.SetNoContext(true) | |
// Return new context | |
return newContext(model, params) | |
} | |