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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Django

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

Python 2.7

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

Q&A

解決済

1回答

429閲覧

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

yu5306

総合スコア13

Django

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

Python 2.7

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

0グッド

0クリップ

投稿2018/11/07 04:59

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

python

1from google.cloud import texttospeech 2 3GENDER = texttospeech.enums.SsmlVoiceGender.NEUTRAL 4ENCODING = texttospeech.enums.AudioEncoding.MP3

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

python

1from django.conf import settings 2 3ssml_gender = settings.GENDER 4audio_encoding = settings.ENCODING 5 6# (途中省略) 7 8voice = texttospeech.types.VoiceSelectionParams( 9 language_code='en-US', 10 ssml_gender=ssml_gender) 11 12# (途中省略) 13 14audio_config = texttospeech.types.AudioConfig( 15 audio_encoding=audio_encoding)

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

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

投稿2018/11/07 07:56

gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gh640

2018/11/07 07:58

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

2018/11/07 08: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) みたいなことができるといいなと。 難しいでしょうか。。
gh640

2018/11/07 09:18

なるほど、「動的」というのはそういうことですね。 いえいえ、まだ勘違いしている可能性はありますが、一般化すると「特定のオブジェクトのアトリビュートを文字列で取得したい」ということですかね。ということですと例えば `getattr()` を使うと次のように書くことができるのですが、このようなイメージでしょうか。 GENDER = "NEUTRAL" ENCODEING = "MP3" ssml_gender = getattr(texttospeech.enums.SsmlVoiceGender, settings.GENDER) audio_encoding = getattr(texttospeech.enums.AudioEncoding, settings.ENCODING)
gh640

2018/11/07 09: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] とするアプローチ等もありなのではないかと思います。
yu5306

2018/11/11 07:02

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

2018/11/12 05:52

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

2018/11/12 13:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問