質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Django

    1610questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

  • Python 2.7

    1457questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Google Cloud Text-To-Speech で動的にパラメーターを指定したい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 281

yu5306

score 1

 Google Cloud Text-To-Speech で動的にパラメーターを指定したい。

 紹介

Python初心者です。どうぞよろしくお願い致します。
初めて投稿致します、投稿の仕方などまだよくわかっておりません。
不足/不明な点などなんでも追加でご報告しますのでご指導くださいませ。

現在、上記サービスを利用してテキストを音声ファイルに変換する機能を実装しています。
下記のコードで、幾つかのパラメータを settings.py で設定し動的に変更できればと考えています。

 音声変換コード

# encoding:utf-8

from google.cloud import texttospeech
from django.conf import settings

# Instantiates a client
client = texttospeech.TextToSpeechClient()

# Set the text input to be synthesized
synthesis_input = texttospeech.types.SynthesisInput(text="Hello, World!")

# Build the voice request, select the language code ("en-US") and the ssml
# voice gender ("neutral")
voice = texttospeech.types.VoiceSelectionParams(
    language_code='en-US',
    ssml_gender=texttospeech.enums.SsmlVoiceGender.NEUTRAL)
    # ↑ MALE, FEMALE, NEUTRAL

# Select the type of audio file you want returned
audio_config = texttospeech.types.AudioConfig(
    audio_encoding=texttospeech.enums.AudioEncoding.MP3)
    # ↑ MP3, OGG_OPUS, OGG_OPUS

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

# The response's audio_content is binary.
with open('output.mp3', 'wb') as out:
    # Write the response to the output file.
    out.write(response.audio_content)
    print('Audio content written to file "output.mp3"')

 settings.py

GENDER = NEUTRAL
ENCODEING = MP3

質問

いろいろ調べてみたのですが、文字列を変数に変換するのに 
exec() とか locals()/globals() を使うなどの方法が紹介されていましたが、
この場合の実装方法を見つけることができませんでした。

具体的な方法、また代替案などありましたらご教示頂ければ幸甚です。
どうぞよろしくお願い致します。

開発環境

Python 2.7.4
Django 1.5
使用ライブラリ google-cloud-texttospeech

Google Cloud 音声合成API

Google Cloud Text-To-Speech

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

(以下のコメントには質問が含まれるので本来「追記・修正依頼」欄に記述すべきところですが、そこだとコードがハイライトされず説明が難しいので解答欄を使ってコメントいたします)

  • 「動的に変更」というのは、 VoiceSelectionParams() の引数 ssml_gender と AudioConfig() の引数 audio_encoding 、この 2 つの引数の値を settings.py の中で定義しておいて、それを「音声変換コード」の方で読み込みたい、ということだと理解しました。この理解で正しいでしょうか?

この質問の回答が「はい」だと仮定して先回りして以下手短に回答してみますね。

settings.py では次のように定義されるとよいかと思います。私が勘違いしていなければ exec() 等は特に必要なさそうかなという気がします。

from google.cloud import texttospeech

GENDER = texttospeech.enums.SsmlVoiceGender.NEUTRAL
ENCODING = texttospeech.enums.AudioEncoding.MP3

そして、「音声変換コード」の方でそれらの値を取得して利用します。

from django.conf import settings

ssml_gender = settings.GENDER
audio_encoding = settings.ENCODING

# (途中省略)

voice = texttospeech.types.VoiceSelectionParams(
    language_code='en-US',
    ssml_gender=ssml_gender)

# (途中省略)

audio_config = texttospeech.types.AudioConfig(
    audio_encoding=audio_encoding)

尚、 ssml_gender 等の中間的な変数は説明をわかりやすくするために定義しているだけなので実際には省略していただいて大丈夫です。

冒頭に書いた私の理解が間違っていればご指摘ください。ご参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/07 16:58

    補足です: 私は Python 2.7 - Django 1.5 の組み合わせを実プロジェクトで使った経験が無いので、もしかしたら `import` 文あたりで間違いがあるかもしれません。試してみてエラーが出れば教えてください :)

    キャンセル

  • 2018/11/07 17:52

    gh640 様 返信ありがとうございます。

    質問がわかりにくくて大変申し訳ありません。
    またご提案ありがとうございます。

    ご提案の方法でも実現可能だとは思うのですが、もう少しコードを見やすくしたいと考えていました。

    ssml_gender=texttospeech.enums.SsmlVoiceGender.NEUTRAL
    audio_encoding=texttospeech.enums.AudioEncoding.MP3

    この ~.NEUTRAL、~.MP3 のところだけを動的に指定する方法はないか、と思ったのです。

    settings.py に
    GENDER = "NEUTRAL"
    ENCODEING = "MP3"

    と設定して、例えばですが、

    ssml_gender=texttospeech.enums.SsmlVoiceGender. (settings.GENDER)
    audio_encoding=texttospeech.enums.AudioEncoding. (settings.ENCODING)

    みたいなことができるといいなと。
    難しいでしょうか。。

    キャンセル

  • 2018/11/07 18:18

    なるほど、「動的」というのはそういうことですね。

    いえいえ、まだ勘違いしている可能性はありますが、一般化すると「特定のオブジェクトのアトリビュートを文字列で取得したい」ということですかね。ということですと例えば `getattr()` を使うと次のように書くことができるのですが、このようなイメージでしょうか。

    GENDER = "NEUTRAL"
    ENCODEING = "MP3"

    ssml_gender = getattr(texttospeech.enums.SsmlVoiceGender, settings.GENDER)
    audio_encoding = getattr(texttospeech.enums.AudioEncoding, settings.ENCODING)

    キャンセル

  • 2018/11/07 18:22 編集

    もっと凝ったことをされたい場合は「音声変換コード」の中で map を用意しておいて

    voice_gender_map = {
    "NEUTRAL": texttospeech.enums.SsmlVoiceGender.NEUTRAL,
    "xxx": texttospeech.enums.SsmlVoiceGender.xxx,
    "yyy": texttospeech.enums.SsmlVoiceGender.yyy,
    }

    ssml_gender = voice_gender_map[settings.GENDER]

    とするアプローチ等もありなのではないかと思います。

    キャンセル

  • 2018/11/11 16:02

    返信が遅くなり大変失礼致しました。 gh640 様 ありがとうございます。
    上記の提案試してみたいと思います!

    キャンセル

  • 2018/11/12 14:52

    getattr() を使ったところ、期待通りに設定ができました。
    どうもありがとうございました!

    キャンセル

  • 2018/11/12 22:32

    ご丁寧に結果をお教えくださりありがとうございます。そうでしたか。よかったです!

    キャンセル

同じタグがついた質問を見る

  • Django

    1610questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

  • Python 2.7

    1457questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。