Go bindings for CTranslate2 using libffi (no CGo required).
- Whisper: Speech recognition and transcription
- Translator: Sequence-to-sequence translation
- Generator: Language model text generation
- The CTranslate2 shared library (
libctranslate2.so,libctranslate2.dylib, orctranslate2.dll) - libffi runtime:
- Linux:
apt install libffi8ordnf install libffi - macOS: Bundled with the system
- Windows: Bundled with the ffi package
- Linux:
go get github.com/ardanlabs/ctranslate2ffiBefore using any functions, load the CTranslate2 shared library:
package main
import "github.com/ardanlabs/ctranslate2ffi"
func main() {
// Provide the directory containing libctranslate2.so/dylib/dll
if err := ctranslate2ffi.Load("/usr/local/lib"); err != nil {
panic(err)
}
// Check version
fmt.Println("CTranslate2 version:", ctranslate2.Version())
}// Load a Whisper model
config := ctranslate2.DefaultModelConfig()
config.Device = ctranslate2.DeviceCPU
config.ComputeType = ctranslate2.ComputeFloat32
whisper, err := ctranslate2.NewWhisper("/path/to/whisper-model", config)
if err != nil {
panic(err)
}
defer whisper.Close()
// Check model properties
fmt.Println("Multilingual:", whisper.IsMultilingual())
fmt.Println("Num mels:", whisper.NumMels())
// Create audio features (mel spectrogram)
// Shape should be [batch_size, n_mels, time_frames]
features, err := ctranslate2.NewStorageViewFloat(melData, []int64{1, 80, 3000}, ctranslate2.DeviceCPU)
if err != nil {
panic(err)
}
defer features.Close()
// Transcribe
opts := ctranslate2.DefaultWhisperOptions()
result, err := whisper.Generate(features, []string{"<|startoftranscript|>", "<|en|>"}, opts)
if err != nil {
panic(err)
}// Load a translation model
translator, err := ctranslate2.NewTranslator("/path/to/model", config)
if err != nil {
panic(err)
}
defer translator.Close()
// Translate tokenized input
opts := ctranslate2.DefaultTranslationOptions()
result, err := translator.Translate([]string{"Hello", "world"}, opts)
if err != nil {
panic(err)
}// Load a language model
generator, err := ctranslate2.NewGenerator("/path/to/model", config)
if err != nil {
panic(err)
}
defer generator.Close()
// Generate text
opts := ctranslate2.DefaultGenerationOptions()
opts.MaxLength = 100
result, err := generator.Generate([]string{"Once", "upon", "a", "time"}, opts)
if err != nil {
panic(err)
}The C API wrapper must be compiled with CTranslate2:
- Copy
ctranslate2_c.htoCTranslate2/include/ - Copy
ctranslate2_c.cctoCTranslate2/src/ - Add the source file to CMakeLists.txt
- Build CTranslate2:
cd CTranslate2
mkdir build && cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make -j$(nproc)Device- CPU or CUDAComputeType- Computation precision (float32, int8, float16, etc.)ModelConfig- Model loading configurationWhisperOptions- Whisper generation optionsTranslationOptions- Translation optionsGenerationOptions- Text generation options
Load(path string)- Load the CTranslate2 shared libraryVersion()- Get library versionCUDAAvailable()- Check if CUDA is availableCUDADeviceCount()- Get number of CUDA devices
GetLastError()- Get the last error messageClearError()- Clear the error state
Apache 2.0