Google TTS в Django: создать аудиофайл в Javascript из base64 String - PullRequest
0 голосов
/ 31 августа 2018

В настоящее время я использую API Google TTS Python Функция "synthesize_text" в одном из моих представлений Django.

def synthesize_text(text):
    """Synthesizes speech from the input string of text."""
    from google.cloud import texttospeech
    client = texttospeech.TextToSpeechClient()

    input_text = texttospeech.types.SynthesisInput(text=text)

    # Note: the voice can also be specified by name.
    # Names of voices can be retrieved with client.list_voices().
    voice = texttospeech.types.VoiceSelectionParams(
        language_code='en-US',
        ssml_gender=texttospeech.enums.SsmlVoiceGender.FEMALE)

    audio_config = texttospeech.types.AudioConfig(
        audio_encoding=texttospeech.enums.AudioEncoding.MP3)

    response = client.synthesize_speech(input_text, voice, audio_config)

    # The response's audio_content is binary.
    # Removing this because I do not care about writing the audio file
    # ----------------------------------------------------
    '''
    with open('output.mp3', 'wb') as out:
        out.write(response.audio_content)
        print('Audio content written to file "output.mp3"')
    '''
    # ----------------------------------------------------
    # instead return the encoded audio_content to decode and play in Javascript
    return response.audio_content


def my_view(request):
    test_audio_content = synthesize_text('Test audio.')
    return render('my_template.html', {'test_audio_content': test_audio_content})

Единственное изменение, которое я внес в функцию «synthesize_text», заключается в том, что я возвращаю audio_content вместо записи его в аудиофайл. Это потому, что я не беспокоюсь о сохранении файла, а просто хочу воспроизвести его в своем шаблоне с использованием Javascript. Google утверждает, что они кодируют audio_content в base64: «API Cloud Text-to-Speech API позволяет преобразовывать слова и предложения в аудиоданные в кодировке base64 естественной человеческой речи. Затем можно преобразовать аудиоданные в воспроизводимый аудиофайл, такой как MP3, с помощью декодирование данных base64. " Поэтому я попытался создать и воспроизвести аудиофайл со следующим кодом, как было предложено здесь :

<!-- my_template.html -->

<script>
var audio_content = "{{ test_audio_content }}";
var snd = new Audio("data:audio/mp3;base64," + audio_content);
console.log(snd);
snd.play();
</script>

Но я получаю следующую ошибку:

Uncaught (in promise) DOMException: Failed to load because no supported source was found.

Я вышел из системы audio_content, и он начинается как b&#39;ÿóDÄH .. не уверен, является ли это base64 или нет. Также я попытался декодировать audio_content, выполнив:

var decoded_content = window.atob(audio_content);

И это также дало мне ошибку, утверждая, что это не base64.

1 Ответ

0 голосов
/ 31 августа 2018

Из вашего примера:

The response's audio_content is binary

Это означает, что вам необходимо кодировать результат как base64, прежде чем вы сможете его использовать:

import base64
...
return base64.b64encode(response.audio_content).decode('ascii'))

Тогда это должно работать с вашим JS-фрагментом точно так, как вы предполагали.

...