From 10fc8b996e9ae95e380a90fae1f202f0b8e207ff Mon Sep 17 00:00:00 2001 From: vmilovanovicc Date: Thu, 28 Sep 2023 11:26:47 +0200 Subject: [PATCH] Add function to convert text to speech --- README.md | 8 ++++---- backend/text_to_speech.go | 42 +++++++++++++++++++++++++++++++++++++++ go.mod | 11 +++------- go.sum | 14 ++----------- main.go | 2 ++ 5 files changed, 53 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 64d7624..95e4036 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Unit tests and [mocks](/backend/mock_client_ops.go) can be found [here](/backend ## AWS SDK for Go -- [AWS SDK Go Reference](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2#section-readme) +- [AWS SDK Go v2 Reference](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2#section-readme) - [`translate` API client](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/translate) @@ -53,9 +53,9 @@ Unit tests and [mocks](/backend/mock_client_ops.go) can be found [here](/backend - [Amazon S3](https://aws.amazon.com/s3/) - [AWS Lambda](https://aws.amazon.com/lambda/) --- -- [Translate Supported Languages](https://docs.aws.amazon.com/translate/latest/dg/what-is-languages.html) -- [Polly Voice List](https://docs.aws.amazon.com/polly/latest/dg/voicelist.html) -- [Polly Supported Languages](https://docs.aws.amazon.com/polly/latest/dg/SupportedLanguage.html) +- [Amazon - Translate Supported Languages](https://docs.aws.amazon.com/translate/latest/dg/what-is-languages.html) +- [Amazon Polly - Voice List](https://docs.aws.amazon.com/polly/latest/dg/voicelist.html) +- [Amazon Polly - Supported Languages](https://docs.aws.amazon.com/polly/latest/dg/SupportedLanguage.html) ## Other - [trufflehog](https://github.com/trufflesecurity/trufflehog) - Secrets/Security Scan diff --git a/backend/text_to_speech.go b/backend/text_to_speech.go index 5b27b27..a0ef780 100644 --- a/backend/text_to_speech.go +++ b/backend/text_to_speech.go @@ -1,8 +1,13 @@ package backend import ( + "context" "fmt" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/polly" + "github.com/aws/aws-sdk-go-v2/service/polly/types" "log" + "strings" ) // GetTargetVoice connects the Amazon Translate language code with the Amazon Polly voice. @@ -21,3 +26,40 @@ func GetTargetVoice(language string) (string, error) { fmt.Println(targetVoice) return targetVoice, nil } + +// GetSpeechSynthesisTaskId function creates a synthesis task which converts provided text into an audio stream. +func GetSpeechSynthesisTaskId(text, bucketName, languageCode, targetVoice string) (taskId, objectName string, err error) { + // Load the Shared AWS Configuration (~/.aws/config) + cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("eu-central-1")) + if err != nil { + log.Fatalf("failed to load configuration, %v\n", err) + } + + client := polly.NewFromConfig(cfg) + + outputFormat := types.OutputFormatMp3 + engine := types.EngineStandard + targetVoice, _ = GetTargetVoice(languageCode) + targetVoiceId := types.VoiceId(targetVoice) + + params := &polly.StartSpeechSynthesisTaskInput{ + Text: &text, + OutputS3BucketName: &bucketName, + OutputFormat: outputFormat, + Engine: engine, + VoiceId: targetVoiceId, + } + + ctx := context.TODO() + resp, err := client.StartSpeechSynthesisTask(ctx, params) + if err != nil { + log.Fatalf("failed to retrieve task id and object name, error: %v\n", err) + return "", "", err + } + taskId = *resp.SynthesisTask.TaskId + uriParts := strings.Split(*resp.SynthesisTask.OutputUri, "/") + objectName = uriParts[len(uriParts)-1] + fmt.Println(taskId) + fmt.Println(objectName) + return taskId, objectName, nil +} diff --git a/go.mod b/go.mod index 50927fd..c6b7240 100644 --- a/go.mod +++ b/go.mod @@ -3,26 +3,21 @@ module zobot go 1.20 require ( - github.com/aws/aws-sdk-go-v2 v1.21.0 github.com/aws/aws-sdk-go-v2/config v1.18.42 - github.com/aws/aws-sdk-go-v2/service/s3 v1.39.0 + github.com/aws/aws-sdk-go-v2/service/polly v1.31.0 + github.com/aws/aws-sdk-go-v2/service/translate v1.19.5 ) require ( - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.13 // indirect + github.com/aws/aws-sdk-go-v2 v1.21.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.40 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.14 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.36 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.4 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.14.1 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.22.0 // indirect - github.com/aws/aws-sdk-go-v2/service/translate v1.19.5 // indirect github.com/aws/smithy-go v1.14.2 // indirect ) diff --git a/go.sum b/go.sum index e6a427b..4a079b6 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.13 h1:OPLEkmhXf6xFPiz0bLeDArZIDx1NNS4oJyG4nv3Gct0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.13/go.mod h1:gpAbvyDGQFozTEmlTFO8XcQKHzubdq0LzRyJpG6MiXM= github.com/aws/aws-sdk-go-v2/config v1.18.42 h1:28jHROB27xZwU0CB88giDSjz7M1Sba3olb5JBGwina8= github.com/aws/aws-sdk-go-v2/config v1.18.42/go.mod h1:4AZM3nMMxwlG+eZlxvBKqwVbkDLlnN2a4UGTL6HjaZI= github.com/aws/aws-sdk-go-v2/credentials v1.13.40 h1:s8yOkDh+5b1jUDhMBtngF6zKWLDs84chUk2Vk0c38Og= @@ -14,18 +12,10 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 h1:SijA0mgjV8E+8G45lt github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 h1:g+qlObJH4Kn4n21g69DjspU0hKTjWtq7naZ9OLCv0ew= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.4 h1:6lJvvkQ9HmbHZ4h/IEwclwv2mrTW8Uq1SOB/kXy0mfw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.4/go.mod h1:1PrKYwxTM+zjpw9Y41KFtoJCQrJ34Z47Y4VgVbfndjo= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.14 h1:m0QTSI6pZYJTk5WSKx3fm5cNW/DCicVzULBgU/6IyD0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.14/go.mod h1:dDilntgHy9WnHXsh7dDtUPgHKEfTJIBUTHM8OWm0f/0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.36 h1:eev2yZX7esGRjqRbnVk1UxMLw4CyVZDpZXRCcy75oQk= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.36/go.mod h1:lGnOkH9NJATw0XEPcAknFBj3zzNTEGRHtSw+CwC1YTg= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.4 h1:v0jkRigbSD6uOdwcaUQmgEwG1BkPfAPDqaeNt/29ghg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.4/go.mod h1:LhTyt8J04LL+9cIt7pYJ5lbS/U98ZmXovLOR/4LUsk8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.39.0 h1:VZ2WMkKLio5tVjYfThcy5+pb6YHGd6B6egq75FfM6hU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.39.0/go.mod h1:rDGMZA7f4pbmTtPOk5v5UM2lmX6UAbRnMDJeDvnH7AM= +github.com/aws/aws-sdk-go-v2/service/polly v1.31.0 h1:yka3FSx/Lxw6UKKpwpSxXjMdVvC7c4UdJsV7ZbUEaXs= +github.com/aws/aws-sdk-go-v2/service/polly v1.31.0/go.mod h1:0PYDQGjUlhE9oe8/OyOyu468dSGK0++Y4CJrx04LeVs= github.com/aws/aws-sdk-go-v2/service/sso v1.14.1 h1:YkNzx1RLS0F5qdf9v1Q8Cuv9NXCL2TkosOxhzlUPV64= github.com/aws/aws-sdk-go-v2/service/sso v1.14.1/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 h1:8lKOidPkmSmfUtiTgtdXWgaKItCZ/g75/jEk6Ql6GsA= diff --git a/main.go b/main.go index 749dcd1..232120e 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,8 @@ import ( ) func main() { + // placeholder backend.TranslateText("hello world", "en") backend.GetTargetVoice("es") + backend.GetSpeechSynthesisTaskId("Testing speech to voice functionality", "bucket-polly19", "es", "") }