今回はPythonを使って、テキストに書いた文字をしゃべらせてみたいと思います。
Windowsの音声入出力標準仕様インターフェース「Speech Application Programming Interface(SAPI)」を使うので、今回紹介するプログラムはWindowsでしか動きません。他の環境では動かないので、予めご了承ください。
準備
pywin32モジュールをインストールします。
|
1 |
pip install pywin32 |
サンプルプログラム1
まず「おはようございます」としゃべるPythonスクリプトは以下のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import win32com.client as wincl voice = wincl.Dispatch("SAPI.SpVoice") # スピード # マイナスにすると遅くなり、1より大きくすると早くなる voice.Rate = 1 # 音量(0~100) voice.Volume = 100 # 使用可能な音声を取得する cat = wincl.Dispatch("SAPI.SpObjectTokenCategory") cat.SetID(r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices", False) # 声の変更 v = [t for t in cat.EnumerateTokens() if t.GetAttribute("Name") == "Microsoft Haruka"] if v: voice.Voice = v[0] # この書き方でエラーが出る場合は、SetVoiceメソッドを使う #voice.SetVoice(v[0]) # しゃべらせる内容 message = "おはようございます。" # 文字列をしゃべらせる voice.Speak(message) |
変数messageの中身を変えれば、他の文をしゃべらせることができます。
11~18行目で女性の声を指定しています。環境によって違うかもしれませんが、日本語の音声は以下の4つが使えるようです。3名が女性、1名が男性の声です。
- Microsoft Ayumi
- Microsoft Haruka
- Microsoft Ichiro
- Microsoft Sayaka
実際にどの音声が使えるかは以下のスクリプトを実行すると確認できます。
|
1 2 3 4 5 6 7 8 |
import win32com.client as wincl # 使用可能な音声を取得する cat = wincl.Dispatch("SAPI.SpObjectTokenCategory") cat.SetID(r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices", False) for token in cat.EnumerateTokens(): print(token.GetDescription()) |
サンプルプログラム2
この機能を使って、テキストファイルを読み込んで会話(掛け合い)をさせてみました。テキストファイルに「@+声の名前,速度」と記載することで、音声と速度を変えるようにしてあります。
入力に使ったテキストファイルとPythonスクリプトは以下の通りです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import win32com.client as wincl voice = wincl.Dispatch("SAPI.SpVoice") # スピード voice.Rate = 1 # 音量(0~100) voice.Volume = 100 # 使用可能な音声を取得する cat = wincl.Dispatch("SAPI.SpObjectTokenCategory") cat.SetID(r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices", False) f = open('対話テスト.txt', 'r') line = f.readline() while line: line = line.strip() if '@' in line: line = line.replace('@', '') name, speed = line.split(',') # 声の変更 v = [t for t in cat.EnumerateTokens() if t.GetAttribute("Name") == f"Microsoft {name}"] if v: voice.Voice = v[0] # この書き方でエラーが出る場合は、SetVoiceメソッドを使う #voice.SetVoice(v[0]) voice.Rate = speed else: # 文字列をしゃべらせる voice.Speak(line) line = f.readline() |
読み込んでいるテキストファイル「対話テスト.txt」
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Ichiro,2 あゆみさん、こんにちは。 @Ayumi,2 こんにちは、一郎さん。 いい天気ですね。 お子さんとどこかにお出かけですか? @Ichiro,2 はい、遊園地に行くところです。 @Ayumi,2 いいですね。 さやかちゃん、楽しんできてね。 @Sayaka,5 うん、ありがとうございます。 |
実際の音声はこちら。
SAPIで合成した音声はイントネーションがぎこちなく聞こえますが、手軽に使える点はいいと思います。
- 投稿タグ
- プログラミング