Объединить два выхода TTS в один mp3-файл не работает - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу объединить два запроса к API преобразования текста в речь в облаке Google в одном выводе mp3.Мне нужно объединить два запроса, потому что вывод должен содержать два разных языка.

Приведенный ниже код прекрасно работает для многих комбинаций языковых пар, но, к сожалению, не для всех.Если я запрашиваю, например, предложение на английском и одно на немецком языке и объединить их, все работает.Если я запрашиваю один на английском и один в Японии, я не могу объединить два файла в одном выводе.Выходные данные содержат только первое предложение и вместо второго предложения выводят тишину.

Я попробовал несколько способов объединить два выхода, но результат остался прежним.Приведенный ниже код должен показать проблему.

Пожалуйста, сначала запустите код с: python synthesize_bug.py --t1 'Hallo' --code1 de-De --t2 'August' --code2 de-De Thisработает отлично.

python synthesize_bug.py --t1 'Hallo' --code1 de-De --t2 'こ ん に ち は' --code2 ja-JP Это не работает.Отдельные файлы в порядке, но объединенные файлы содержат тишину вместо японской части.Кроме того, если используется с двумя предложениями Японии, все работает.

Я уже подал отчет об ошибке в Google, но ответа пока нет, но, может быть, это только я делаю что-то не так с предположениями о кодировке.Надеюсь, у кого-то есть идея.

#!/usr/bin/env python

import argparse

# [START tts_synthesize_text_file]
def synthesize_text_file(text1, text2, code1, code2):
    """Synthesizes speech from the input file of text."""
    from apiclient.discovery import build
    import base64

    service = build('texttospeech', 'v1beta1')
    collection = service.text()

    data1 = {}
    data1['input'] = {}
    data1['input']['ssml'] = '<speak><break time="2s"/></speak>'
    data1['voice'] = {}
    data1['voice']['ssmlGender'] = 'FEMALE'
    data1['voice']['languageCode'] = code1
    data1['audioConfig'] = {}
    data1['audioConfig']['speakingRate'] = 0.8
    data1['audioConfig']['audioEncoding'] = 'MP3'

    request = collection.synthesize(body=data1)
    response = request.execute() 
    audio_pause = base64.b64decode(response['audioContent'].decode('UTF-8'))
    raw_pause = response['audioContent']

    ssmlLine = '<speak>' + text1 + '</speak>' 

    data1 = {}
    data1['input'] = {}
    data1['input']['ssml'] = ssmlLine
    data1['voice'] = {}
    data1['voice']['ssmlGender'] = 'FEMALE'
    data1['voice']['languageCode'] = code1
    data1['audioConfig'] = {}
    data1['audioConfig']['speakingRate'] = 0.8
    data1['audioConfig']['audioEncoding'] = 'MP3'

    request = collection.synthesize(body=data1)
    response = request.execute() 

    # The response's audio_content is binary.
    with open('output1.mp3', 'wb') as out:
        out.write(base64.b64decode(response['audioContent'].decode('UTF-8')))
        print('Audio content written to file "output1.mp3"')

        audio_text1 = base64.b64decode(response['audioContent'].decode('UTF-8'))
        raw_text1 = response['audioContent']

    ssmlLine = '<speak>' + text2 + '</speak>' 

    data2 = {}
    data2['input'] = {}
    data2['input']['ssml'] = ssmlLine
    data2['voice'] = {}
    data2['voice']['ssmlGender'] = 'MALE'
    data2['voice']['languageCode'] = code2 #'ko-KR'
    data2['audioConfig'] = {}
    data2['audioConfig']['speakingRate'] = 0.8
    data2['audioConfig']['audioEncoding'] = 'MP3'

    request = collection.synthesize(body=data2)
    response = request.execute() 

    # The response's audio_content is binary.
    with open('output2.mp3', 'wb') as out:
        out.write(base64.b64decode(response['audioContent'].decode('UTF-8')))
        print('Audio content written to file "output2.mp3"')

    audio_text2 = base64.b64decode(response['audioContent'].decode('UTF-8'))
    raw_text2 = response['audioContent']

    result = audio_text1 + audio_pause + audio_text2
    with open('result.mp3', 'wb') as out:
        out.write(result)
    print('Audio content written to file "result.mp3"')

    raw_result = raw_text1 + raw_pause + raw_text2
    with open('raw_result.mp3', 'wb') as out:
        out.write(base64.b64decode(raw_result.decode('UTF-8')))
    print('Audio content written to file "raw_result.mp3"')
# [END tts_synthesize_text_file]ls



if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('--t1')
    parser.add_argument('--code1')
    parser.add_argument('--t2')
    parser.add_argument('--code2')
    args = parser.parse_args()

    synthesize_text_file(args.t1, args.t2, args.code1, args.code2)

1 Ответ

0 голосов
/ 21 декабря 2018

Вы можете найти ответ здесь: https://issuetracker.google.com/issues/120687867

Краткий ответ: Непонятно, почему он не работает, но Google предлагает обходной путь, чтобы сначала записать файлы как .wav, объединить, а затем повторнозакодировать результат в mp3.

...