Skip to content

Commit fee63d7

Browse files
committed
Add go bindings
1 parent 5965ea3 commit fee63d7

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

go/example/main.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"os"
6+
".."
7+
)
8+
9+
func main() {
10+
var filename string
11+
flag.StringVar(&filename, "f", "", "file to transcribe")
12+
flag.Parse()
13+
model, err := vosk.NewModel("model")
14+
rec, err := vosk.NewRecognizer(model)
15+
16+
file, err := os.Open(filename)
17+
if err != nil {
18+
panic(err)
19+
}
20+
defer file.Close()
21+
22+
fileinfo, err := file.Stat()
23+
if err != nil {
24+
panic(err)
25+
}
26+
27+
filesize := fileinfo.Size()
28+
buffer := make([]byte, filesize)
29+
30+
_, err = file.Read(buffer)
31+
if err != nil {
32+
panic(err)
33+
}
34+
35+
println(vosk.VoskFinalResult(rec, buffer))
36+
}

go/vosk.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package vosk
2+
3+
// #cgo CPPFLAGS: -I ${SRCDIR}/../src
4+
// #cgo LDFLAGS: -L ${SRCDIR}/../src -lvosk -ldl -lpthread
5+
// #include <stdlib.h>
6+
// #include <vosk_api.h>
7+
import "C"
8+
9+
// VoskModel contains a reference to the C VoskModel
10+
type VoskModel struct {
11+
model *C.struct_VoskModel
12+
}
13+
14+
// VoskSpkModel contains a reference to the C VoskSpkModel
15+
type VoskSpkModel struct {
16+
spkModel *C.struct_VoskSpkModel
17+
}
18+
19+
// VoskRecognizer contains a reference to the C VoskRecognizer
20+
type VoskRecognizer struct {
21+
rec *C.struct_VoskRecognizer
22+
}
23+
24+
func VoskFinalResult(recognizer *VoskRecognizer, buffer []byte) string {
25+
cbuf := C.CBytes(buffer)
26+
defer C.free(cbuf)
27+
_ = C.vosk_recognizer_accept_waveform(recognizer.rec, (*C.char)(cbuf), C.int(len(buffer)))
28+
result := C.GoString(C.vosk_recognizer_final_result(recognizer.rec))
29+
return result
30+
}
31+
32+
// NewModel creates a new VoskModel instance
33+
func NewModel(modelPath string) (*VoskModel, error) {
34+
var internal *C.struct_VoskModel
35+
internal = C.vosk_model_new(C.CString(modelPath))
36+
model := &VoskModel{model: internal}
37+
return model, nil
38+
}
39+
40+
// NewRecognizer creates a new VoskRecognizer instance
41+
func NewRecognizer(model *VoskModel) (*VoskRecognizer, error) {
42+
var internal *C.struct_VoskRecognizer
43+
internal = C.vosk_recognizer_new(model.model, 16000.0)
44+
rec := &VoskRecognizer{rec: internal}
45+
return rec, nil
46+
}
47+
48+
func freeModel(model *VoskModel) {
49+
C.vosk_model_free(model.model)
50+
}
51+
52+
func freeRecognizer(recognizer *VoskRecognizer) {
53+
C.vosk_recognizer_free(recognizer.rec)
54+
}
55+
56+
// NewSpkModel creates a new VoskSpkModel instance
57+
func NewSpkModel(spkModelPath string) (*VoskSpkModel, error) {
58+
var internal *C.struct_VoskSpkModel
59+
internal = C.vosk_spk_model_new(C.CString(spkModelPath))
60+
spkModel := &VoskSpkModel{spkModel: internal}
61+
return spkModel, nil
62+
}

0 commit comments

Comments
 (0)