![見出し画像](https://assets.st-note.com/production/uploads/images/137905074/rectangle_large_type_2_81d0ee39255a48c7b54ac72f6a778ad4.png?width=1200)
【Python】pyttsx3で音声ファイル作成! テキストを音声に変換して、再生や保存が可能! ~備忘録~
pyttsx3は、Pythonで利用できるオープンソースのテキスト読み上げライブラリです。このライブラリを使用することで、様々な用途でテキストを音声に変換することができます。
本記事では、pyttsx3の基本的な操作方法を説明します。具体的には、以下の内容について解説します。
エンジンの初期化と読み上げ
音声ファイルへの保存
音声プロパティの設定
公式ドキュメントはコチラ
■はじめに
pyttsx3を利用するには、まずライブラリをインストールする必要があります。コマンドプロンプトを開き、以下のコマンドを実行することでインストールできます。
pip install pyttsx3
■pyttsx3の使い方
pyttsx3の使い方をサンプルコードを使って説明します。
■サンプルコード:次女のトレーニング支援
今回ご紹介するコードは、次女がプランクするときに使用するものです。
公式アプリが使えなくなったそうなので、代用として作ったものです。
'''
プランク用マット
次女トレーニング用読み上げプログラム
- プランク用マットに書かれた番号に、手を移動させる。
- 公式アプリが使えなくなってしまったらしいので代用として作成
'''
import pyttsx3
import random
from time import sleep
# 準備
LR = ["ひだり", "みぎ "]
numbers = [ n for n in range(1, 9) ] #番号 1 - 8 まで
# エンジン初期化
engine = pyttsx3.init()
# 読み上げるテキストを設定
speak = "今日もトレーニングがんばりましょう。\n手の位置を『ひだり1』『みぎ1』にあわせてください。"
print(speak)
engine.say( speak )
# 読み上げ開始
engine.runAndWait()
sleep(3)
# 読み上げるテキストを設定
speak = "それでは開始します。"
engine.say( speak )
print(speak)
# 読み上げ開始
engine.runAndWait()
sleep(1)
# 音量の設定(0.0 - 1.0) ※初期値1.0
engine.setProperty('volume', 0.9)
# 話速の設定(200 - 600が適切な範囲) ※初期値200
engine.setProperty('rate', 100)
# 処理開始:徐々に手の移動を速くしていく。
for i in range(1, 31):
speak = random.choice(LR) + "ーのー" + str(random.choice(numbers))
# 音声の大きさを変更する場合
volume = engine.getProperty('volume')
engine.setProperty('volume', volume + 0.01)
# 現在の話速を取得し、話速を10ずつ速くする。
rate = engine.getProperty('rate')
engine.setProperty('rate', rate + 5)
# 読み上げるテキストを設定
engine.say( speak )
print(speak.replace('ーのー',' '))
# 読み上げ開始
engine.runAndWait()
sleep(5 * (1-i/30))
speak = "今日もお疲れさまでした!"
print(speak)
engine.say( speak )
engine.runAndWait()
# 結果例 #
ひだり 1
みぎ 5
みぎ 4
ひだり 8 ……
■サンプルコード2:テキストファイルを読み込んで音声ファイルで保存する。
'''
前提条件:
読み込みたいテキストファイル(sample.txt)を準備してください。
'''
import pyttsx3
import re
speak = "テキストを読み込んで、音声ファイルで保存"
print(speak)
#エンジン初期化
engine = pyttsx3.init()
# 音量の設定(0.0 - 1.0)
engine.setProperty('volume', 1.0)
# 話速の設定(200 - 600が適切な範囲)
engine.setProperty('rate', 300)
# 音声の種類を設定
#voices = engine.getProperty('voices')
#engine.setProperty('voice', voices[0].id) # 1番目の音声を選択
# ファイルを読み込んで音声ファイルにする。
with open('sample.txt', mode="r", encoding="utf-8") as f:
text = f.read()
# テキスト調整
# ①URL部分を読まれると長くてわかりづらいので、"URL削除"に置き換え
text = re.sub(r"(https?://[\w\-\.]+\.[a-zA-Z]+(/[\w\-\.]*)*)", "URL削除", text)
# ②空白行を削除
text = re.sub(r"^\s*$|^\n", "", text, flags=re.MULTILINE)
# ③"#"が"イゲタイゲタイゲタ..."と連呼されると嫌なので"シャープ"1つに置き換え
text = re.sub(r"#+", "シャープ", text) #
# wavファイルに保存
engine.save_to_file(text, 'text2voice.wav')
engine.runAndWait() #実行
# 実行結果確認
print(text)
■解説
1. エンジンの初期化
pyttsx3を使用する前に、エンジンを初期化する必要があります。以下のコードを実行することで、エンジンを初期化できます。
import pyttsx3
engine = pyttsx3.init()
2. 読み上げるテキストの設定
読み上げるテキストは、engine.say()メソッドを使用して設定します。
engine.say('読み上げたいテキスト')
engine.say('データはキューとして格納されていく')
内容はキューとして格納されます。
3. 読み上げの実行
読み上げを実行するには、engine.runAndWait()メソッドを使用します。
engine.runAndWait()
上記 2. の場合だと、実行結果は『読み上げたいテキスト データはキューとして格納されていく』と読み上げられます。
4. 音量の調整
音量は、volumeプロパティを使用して設定します。値は0.0~1.0の範囲で、0.0が最も小さく、1.0が最も大きくなります。
engine.setProperty('volume', 0.5) # 音量設定
現在の設定から変更したい場合
volume = engine.getProperty('volume') # プロパティから音量取得
engine.setProperty('volume', volume + 0.1) # 音量を上げる
engine.setProperty('volume', volume - 0.1) # 音量を下げる
5. 話速の調整
話速は、rateプロパティを使用して設定します。値は200~600の範囲が適正な値とされています。
rate = engine.getProperty('rate')
engine.setProperty('rate', rate + 50) # 話速を上げる
engine.setProperty('rate', rate - 50) # 話速を下げる
6. 音声の種類の設定
音声の種類は、voiceプロパティを使用して設定します。利用可能な音声の一覧は、engine.getProperty('voices')メソッドで取得できます。
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id) # 1番目の音声を選択
音声の種類が知りたい場合
# 音声の種類一覧を取得したいとき
voices = engine.getProperty('voices')
print([voice.name for voice in voices])
# 結果例:
#['Microsoft Haruka Desktop - Japanese', 'Microsoft Zira Desktop - English (United States)']
7. 音声ファイルへの保存
読み上げた音声をファイルに保存するには、save_to_file()メソッドを使用します。
engine.save_to_file('読み上げ.wav', '読み上げたいテキスト')
■まとめ
pyttsx3は、様々な用途でテキストを音声に変換できる便利なライブラリです。以前紹介した、PDFをテキストに変換して音声で読み込ませたり、スクレイピングと組み合わせたりするなど、いろいろ便利になることがあるかと思います。
この記事が役に立つことがあれば幸いです。
この記事が気に入ったらサポートをしてみませんか?