androidgoogle-cloud-storagegoogle-authenticationgoogle-text-to-speech

Google Cloud TextToSpeech : java.io.IOException: The Application Default Credentials are not available


I am trying to run the TextToSpeech code from Google Cloud TextToSpeech Service.

Curently stuck at Authentication part referring link Authenticating as a service account

Below is the Code :

public class TexttoSpeech {

/** Demonstrates using the Text-to-Speech API. */
public static void getAudio() throws Exception {
    // Instantiates a client
 // Below Line is Point of Error in Code 
    try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
        // Set the text input to be synthesized
        SynthesisInput input = SynthesisInput.newBuilder().setText("Hello, World!").build();

        // Build the voice request, select the language code ("en-US") and the ssml voice 
         //gender
        // ("neutral")
        VoiceSelectionParams voice =
                VoiceSelectionParams.newBuilder()
                        .setLanguageCode("en-US")
                        .setSsmlGender(SsmlVoiceGender.NEUTRAL)
                        .build();

        // Select the type of audio file you want returned
        AudioConfig audioConfig =
                AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();

        // Perform the text-to-speech request on the text input with the selected voice parameters and
        // audio file type
        SynthesizeSpeechResponse response =
                textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);

        // Get the audio contents from the response
        ByteString audioContents = response.getAudioContent();
        byte[] audioArray=audioContents.toByteArray();
        String converted= Base64.encodeBase64String(audioArray);
        playAudio(converted);

        // Write the response to the output file.
        try (OutputStream out = new FileOutputStream("output.mp3")) {
            out.write(audioContents.toByteArray());
            System.out.println("Audio content written to file \"output.mp3\"");
        }
    }
}

public static void playAudio(String base64EncodedString){
    try
    {
        String url = "data:audio/mp3;base64,"+base64EncodedString;
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setDataSource(url);
        mediaPlayer.prepare();
        mediaPlayer.start();
    }
    catch(Exception ex){
        System.out.print(ex.getMessage());
    }
  }
}

But getting below error on :

java.io.IOException: The Application Default Credentials are not available. They are available 
if running in Google Compute Engine. Otherwise, the environment variable 
GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. 
See https://developers.google.com/accounts/docs/application-default-credentials for more 
information.

Also tried Explicit credentials :

 @Throws(IOException::class)
 fun authExplicit() {
    val projectID = "texttospeech-12345"  // dummy id
//        val imageUri: Uri = 
Uri.fromFile(File("file:\\android_asset\\service_account_file.json"))
//        val path=File(imageUri.path).absolutePath
    // You can specify a credential file by providing a path to GoogleCredentials.
    // Otherwise credentials are read from the GOOGLE_APPLICATION_CREDENTIALS environment 
 variable.
    val credentials = 
GoogleCredentials.fromStream(mContext.resources.openRawResource(R.raw.service_account_file))
        .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"))
    val storage: Storage =      
StorageOptions.newBuilder().setProjectId(projectID).setCredentials(credentials)
               .build().service
    println("Buckets:")

   // Error at storage.lists()
    val buckets: Page<Bucket> = storage.list()
    for (bucket in buckets.iterateAll()) {
        println(bucket.toString())
    }
}

But on device it gives error like :

  Error getting access token for service account: 
  Unable to resolve host "oauth2.googleapis.com": No address associated with hostname, iss: 
  xyz@texttospeech-12345.iam.serviceaccount.com

And on Emulator the error is :

 xxxxxxxxx does not have storage.buckets.list access to the Google Cloud project.

Please let me know if you guys need something more.

Any suggestion will be appreciated

Thanks in Advance

Also if I run below command in Cloud SDK :

gcloud auth application-default login

I get this but I didnt understood what its trying to say enter image description here


Solution

  • You can pass the credentials while creating the client connection.

    TextToSpeechSettings settings = TextToSpeechSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(authExplicit("JSON FILE PATH")))
            .build();
    try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create(settings)) {
        // ... rest of your code
    }
    // ... rest of your code
    

    And

    public static GoogleCredentials authExplicit(String jsonPath) throws IOException {
    
        GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath))
            .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
    
        return credentials;
    }
    

    GoogleCredentials imported from Google Auth Library For Java OAuth2 HTTP

    N.B You need to make sure you are able to fetch the JSON file in your application.