Как включить Neural Text-to-Speech (NTTS) в Java с помощью Amazon Polly - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь использовать Amazon Polly для преобразования текста в речь, используя Java API. Как описывает Amazon, в США есть несколько голосов engli sh, которые поддерживают Neural. https://docs.aws.amazon.com/polly/latest/dg/voicelist.html

Следующий код для запуска в приложении Java выглядит следующим образом:

package com.amazonaws.demos.polly;

import java.io.IOException;
import java.io.InputStream;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.polly.AmazonPollyClient;
import com.amazonaws.services.polly.model.DescribeVoicesRequest;
import com.amazonaws.services.polly.model.DescribeVoicesResult;
import com.amazonaws.services.polly.model.OutputFormat;
import com.amazonaws.services.polly.model.SynthesizeSpeechRequest;
import com.amazonaws.services.polly.model.SynthesizeSpeechResult;
import com.amazonaws.services.polly.model.Voice;

import javazoom.jl.player.advanced.AdvancedPlayer;
import javazoom.jl.player.advanced.PlaybackEvent;
import javazoom.jl.player.advanced.PlaybackListener;

public class PollyDemo {

    private final AmazonPollyClient polly;
    private final Voice voice;
    private static final String JOANNA="Joanna"; 
    private static final String KENDRA="Kendra"; 
    private static final String MATTHEW="Matthew"; 
    private static final String SAMPLE = "Congratulations. You have successfully built this working demo of Amazon Polly in Java. Have fun building voice enabled apps with Amazon Polly (that's me!), and always look at the AWS website for tips and tricks on using Amazon Polly and other great services from AWS";

    public PollyDemo(Region region) {
        // create an Amazon Polly client in a specific region
        polly = new AmazonPollyClient(new DefaultAWSCredentialsProviderChain(), 
        new ClientConfiguration());
        polly.setRegion(region);

        // Create describe voices request.
        DescribeVoicesRequest describeVoicesRequest = new DescribeVoicesRequest();

        // Synchronously ask Amazon Polly to describe available TTS voices.
        DescribeVoicesResult describeVoicesResult = polly.describeVoices(describeVoicesRequest);
        //voice = describeVoicesResult.getVoices().get(0);
        voice = describeVoicesResult.getVoices().stream().filter(p -> p.getName().equals(MATTHEW)).findFirst().get();
    }

    public InputStream synthesize(String text, OutputFormat format) throws IOException {
        SynthesizeSpeechRequest synthReq = 
        new SynthesizeSpeechRequest().withText(text).withVoiceId(voice.getId())
                .withOutputFormat(format);
        SynthesizeSpeechResult synthRes = polly.synthesizeSpeech(synthReq);

        return synthRes.getAudioStream();
    }

    public static void main(String args[]) throws Exception {
        //create the test class
        PollyDemo helloWorld = new PollyDemo(Region.getRegion(Regions.US_WEST_1));
        //get the audio stream
        InputStream speechStream = helloWorld.synthesize(SAMPLE, OutputFormat.Mp3);

        //create an MP3 player
        AdvancedPlayer player = new AdvancedPlayer(speechStream,
                javazoom.jl.player.FactoryRegistry.systemRegistry().createAudioDevice());

        player.setPlayBackListener(new PlaybackListener() {
            @Override
            public void playbackStarted(PlaybackEvent evt) {
                System.out.println("Playback started");
                System.out.println(SAMPLE);
            }

            @Override
            public void playbackFinished(PlaybackEvent evt) {
                System.out.println("Playback finished");
            }
        });


        // play it!
        player.play();

    }
} 

По умолчанию он принимает стандарт голоса Мэтью. Пожалуйста, предложите, что нужно изменить, чтобы сделать речь Нейронной для голоса Матфея.

Спасибо

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Спасибо @ASR за ваш отзыв.

Мне удалось найти параметр engine , как вы и предлагали.

Я должен был решить это следующим образом:

  1. Обновите версию aws - java -sdk-polly с 1.11.77 (как они имеют в своей документации) до последней версии 1.11.762 в pom. xml и создайте проект Maven. Это дает последнее определение класса для класса SynthesizeSpeechRequest. С 1.11.77 мне не удалось увидеть функцию withEngine в ее определении.
<dependency>
 <groupId>com.amazonaws</groupId>
 <artifactId>aws-java-sdk-polly</artifactId>
 <version>1.11.762</version>
</dependency>
Обновлен withEngine ("нейронный"), как показано ниже:
SynthesizeSpeechRequest synthReq = 
        new SynthesizeSpeechRequest().withText(text).withVoiceId(voice.getId())
                .withOutputFormat(format).withEngine("neural");
Как определено в https://docs.aws.amazon.com/polly/latest/dg/NTTS-main.html Нейронный голос доступен только в определенных c регионах. Поэтому мне пришлось выбрать следующее:
PollyDemo helloWorld = new PollyDemo(Region.getRegion(Regions.US_WEST_2));

После этого нейронный голос работал отлично.

0 голосов
/ 10 апреля 2020

Я предполагаю, что вы используете AWS Java SDK 1.11

AWS документация здесь заявляет, что вам нужно установить параметр engine в запросе на системный синтез речи до neural. AWS Java документация SDK здесь описывает метод withEngine для установки его на neural.

PS: страница документации, похоже, не содержит URL-адреса методов, так что вам придется искать его.

...