diff --git a/main.go b/main.go index b92ed07..d89d755 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "encoding/binary" "flag" "fmt" + "io" "io/ioutil" "log" "os" @@ -16,10 +17,11 @@ import ( ) type CommandlineOptions struct { + ListVoices *bool `json:"listvoices,omitempty"` Ssml *bool `json:"ssml,omitempty"` Output *string `json:"output,omitempty"` Input *string `json:"input,omitempty"` - Language *string `json:"lang,omitempty"` + Language *string `json:"language,omitempty"` Gender *string `json:"gender,omitempty"` Voice *string `json:"voice,omitempty"` Format *string `json:"format,omitempty"` @@ -32,6 +34,7 @@ type CommandlineOptions struct { func main() { //check commandline args: opts := &CommandlineOptions{ + ListVoices: flag.Bool("listvoices", false, "List available voices, rather than generate TTS. Use in\ncombination with '-l ALL' to show voices from all languages."), Ssml: flag.Bool("ssml", false, "Input is SSML format, rather than plain text."), Input: flag.String("i", "-", "Input file path. Defaults to stdin."), Output: flag.String("o", "./tts.mp3", "Output file path. Use '-' for stdout."), @@ -77,6 +80,23 @@ func main() { filename = *opts.Output } + /////////////////////////////////////// + //Instantiates a Google Cloud client + ctx := context.Background() + client, err := texttospeech.NewClient(ctx) + if err != nil { + log.Fatal(err) + } + defer client.Close() + + if *opts.ListVoices { + fmt.Println("Available Voices:") + bufStdout := bufio.NewWriter(os.Stdout) + listVoices(bufStdout, ctx, client, *opts.Language) + bufStdout.Flush() + os.Exit(0) + } + var inputFile *os.File if *opts.Input == "-" { //read input from stdin @@ -99,15 +119,6 @@ func main() { input = input + scanner.Text() } - /////////////////////////////////////// - //Instantiates a Google Cloud client - ctx := context.Background() - client, err := texttospeech.NewClient(ctx) - if err != nil { - log.Fatal(err) - } - defer client.Close() - //Start building TTS request things synthInput := &texttospeechpb.SynthesisInput{} synthInput.InputSource = &texttospeechpb.SynthesisInput_Text{Text: input} @@ -168,3 +179,25 @@ func main() { } } + +func listVoices(w io.Writer, ctx context.Context, client *texttospeech.Client, lang string) error { + resp, err := client.ListVoices(ctx, &texttospeechpb.ListVoicesRequest{}) + if err != nil { + return err + } + + for _, voice := range resp.Voices { + for _, languageCode := range voice.LanguageCodes { + if lang == languageCode || lang == "ALL" { + fmt.Fprintln(w, "___________________________________") + fmt.Fprintf(w, "Name: %v\n", voice.Name) + fmt.Fprintf(w, " Language: %v\n", languageCode) + fmt.Fprintf(w, " Gender: %v\n", voice.SsmlGender.String()) + fmt.Fprintf(w, " Native Sample Rate (in Hz): %v\n", voice.NaturalSampleRateHertz) + } + } + } + fmt.Fprintln(w, "------------------------------------") + + return nil +}