Spaces:
Configuration error
Configuration error
package backend | |
import ( | |
"context" | |
"fmt" | |
"os" | |
"path/filepath" | |
"github.com/mudler/LocalAI/core/config" | |
"github.com/mudler/LocalAI/pkg/grpc/proto" | |
"github.com/mudler/LocalAI/pkg/model" | |
"github.com/mudler/LocalAI/pkg/utils" | |
) | |
func ModelTTS( | |
backend, | |
text, | |
modelFile, | |
voice, | |
language string, | |
loader *model.ModelLoader, | |
appConfig *config.ApplicationConfig, | |
backendConfig config.BackendConfig, | |
) (string, *proto.Result, error) { | |
bb := backend | |
if bb == "" { | |
bb = model.PiperBackend | |
} | |
opts := ModelOptions(config.BackendConfig{}, appConfig, []model.Option{ | |
model.WithBackendString(bb), | |
model.WithModel(modelFile), | |
}) | |
ttsModel, err := loader.BackendLoader(opts...) | |
if err != nil { | |
return "", nil, err | |
} | |
if ttsModel == nil { | |
return "", nil, fmt.Errorf("could not load piper model") | |
} | |
if err := os.MkdirAll(appConfig.AudioDir, 0750); err != nil { | |
return "", nil, fmt.Errorf("failed creating audio directory: %s", err) | |
} | |
fileName := utils.GenerateUniqueFileName(appConfig.AudioDir, "tts", ".wav") | |
filePath := filepath.Join(appConfig.AudioDir, fileName) | |
// If the model file is not empty, we pass it joined with the model path | |
modelPath := "" | |
if modelFile != "" { | |
// If the model file is not empty, we pass it joined with the model path | |
// Checking first that it exists and is not outside ModelPath | |
// TODO: we should actually first check if the modelFile is looking like | |
// a FS path | |
mp := filepath.Join(loader.ModelPath, modelFile) | |
if _, err := os.Stat(mp); err == nil { | |
if err := utils.VerifyPath(mp, appConfig.ModelPath); err != nil { | |
return "", nil, err | |
} | |
modelPath = mp | |
} else { | |
modelPath = modelFile | |
} | |
} | |
res, err := ttsModel.TTS(context.Background(), &proto.TTSRequest{ | |
Text: text, | |
Model: modelPath, | |
Voice: voice, | |
Dst: filePath, | |
Language: &language, | |
}) | |
if err != nil { | |
return "", nil, err | |
} | |
// return RPC error if any | |
if !res.Success { | |
return "", nil, fmt.Errorf(res.Message) | |
} | |
return filePath, res, err | |
} | |