web-dev-qa-db-ja.com

Google-text-to-speechに一時停止を追加する

目的のテキストを読み上げるときに、少しの休憩、待機、休憩、または短い休憩(約2秒+-、設定可能が理想的)を可能にするものを探しています。

オンラインの人々は、3つの完全なストップを追加し、その後にスペースを1つ追加すると、休憩が生じると述べていますが、私はそうはいきません。以下のコードは、悲しいことに、一時停止のない私のテストです。アイデアや提案はありますか?

編集:これを可能にするgTTSからのコマンドがある場合、または実際に機能する場合は3つのフルストップを使用するようなトリックがあると理想的です。

from gtts import gTTS
import os

tts = gTTS(text=" Testing ... if there is a pause ... ... ... ... ...  longer pause? ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... insane pause   " , lang='en', slow=False)

tts.save("temp.mp3")
os.system("temp.mp3")

5
Barry Sturgeon

悲しいことに答えはnoです。gTTSパッケージにはpauseの追加機能はありません2018年に作成されました一時停止関数を追加します 、それは十分にスマートです tokenizer によって自然な一時停止を追加します。

トークナイザーとは何ですか?

テキストを取り、それをトークン(文字列)のリストに分割して返す関数。 gTTSコンテキストでは、その目的は、TTS APIリクエストごとに許可される最大文字サイズ(100)を超えない小さなセグメントにテキストをカットし、音声を自然で連続的なものにすることです。これは、スピーチが自然に一時停止する場所(たとえば、_"."_)でテキストを分割することにより、そうでない場所(たとえば、「10.5」または「U.S.A.」)で処理します。このようなルールはトークナイザーケースと呼ばれ、リストを取得します。

次に例を示します。

_text = "regular text speed no pause regular text speed comma pause, regular text speed period pause. regular text speed exclamation pause! regular text speed ellipses pause... regular text speed new line pause \n regular text speed "
_

したがって、この場合、sleep()を追加することが唯一の答えのようです。しかし、トークナイザーをだますことは言及する価値があります。

1

これを実現するには、音声合成マークアップ言語(SSML)が必要です。
Google Cloud Platformcredentialsを設定する必要があることに注意してください

最初にbashで:

pip install --upgrade google-cloud-texttospeech

次に、コードは次のとおりです。

import html
from google.cloud import texttospeech

def ssml_to_audio(ssml_text, outfile):
    # Instantiates a client
    client = texttospeech.TextToSpeechClient()

    # Sets the text input to be synthesized
    synthesis_input = texttospeech.SynthesisInput(ssml=ssml_text)

    # Builds the voice request, selects the language code ("en-US") and
    # the SSML voice gender ("MALE")
    voice = texttospeech.VoiceSelectionParams(
        language_code="en-US", ssml_gender=texttospeech.SsmlVoiceGender.MALE
    )

    # Selects the type of audio file to return
    audio_config = texttospeech.AudioConfig(
        audio_encoding=texttospeech.AudioEncoding.MP3
    )

    # Performs the text-to-speech request on the text input with the selected
    # voice parameters and audio file type
    response = client.synthesize_speech(
        input=synthesis_input, voice=voice, audio_config=audio_config
    )

    # Writes the synthetic audio to the output file.
    with open(outfile, "wb") as out:
        out.write(response.audio_content)
        print("Audio content written to file " + outfile)

def text_to_ssml(inputfile):

    raw_lines = inputfile

    # Replace special characters with HTML Ampersand Character Codes
    # These Codes prevent the API from confusing text with
    # SSML commands
    # For example, '<' --> '&lt;' and '&' --> '&amp;'

    escaped_lines = html.escape(raw_lines)

    # Convert plaintext to SSML
    # Wait two seconds between each address
    ssml = "<speak>{}</speak>".format(
        escaped_lines.replace("\n", '\n<break time="2s"/>')
    )

    # Return the concatenated string of ssml script
    return ssml



text = """Here are <say-as interpret-as="characters">SSML</say-as> samples.
  I can pause <break time="3s"/>.
  I can play a sound"""

ssml = text_to_ssml(text)
ssml_to_audio(ssml, "test.mp3")

その他のドキュメント:
SSMLでアドレスを話す

ただし、Google Cloud Platformの認証情報がない場合は、time.sleep(1)メソッドを使用する方が安価で簡単な方法です。

0
Peyman Majidi

複数のmp3ファイルを保存してから、time.sleep()を使用して、希望する一時停止時間でそれぞれを呼び出すことができます。

from gtts import gTTS
import os
from time import sleep

tts1 = gTTS(text="Testingn" , lang='en', slow=False)
tts2 = gTTS(text="if there is a pause" , lang='en', slow=False)
tts3 = gTTS(text="insane pause   " , lang='en', slow=False)

tts1.save("temp1.mp3")
tts2.save("temp2.mp3")
tts3.save("temp3.mp3")

os.system("temp1.mp3")
sleep(2)
os.system("temp2.mp3")
sleep(3)
os.system("temp3.mp3")
0
Ann Zen