0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPTでTextToSpeechの爆速コーディング

Posted at

はじめに

これも今更ネタですが必要にかられて作ってみたら思いのほか本当に爆速で用意できたのでこの体験を共有したくて書きました。
私はChatGPT初心者でpython中級くらいです。
Copilotがあるじゃんとかそういうのはわかってます。私の場合面倒くさいソリューションやエディタなんかも起動せず思いのままに、それこそ片手間に作りたいものを作る。
そのためにChatGPTをどう使うかっていう話です。

誰向け?

ChatGPT無料を多少触っている
pythonは少しわかる
pip installてうったことはある
くらいかそれ以上の人

環境

windows11Pro 22H2
python3.12.1
※pythonだけは先にインストールしてパスを通している前提です
GPTのCustom instructionsに気持ちだけお勧め汎用プロンプトを適用
※そんなに影響ないと思います

目指すもの

テキストを適宜入力してリアルタイムに音声再生するスクリプトを作る
作成まで5分を目指す

開始

早速GPTを開きます。
私はいつも最初はどの言語何をしたいかを簡潔に聞きます。

次を入力
pythonを使って入力したテキストを音声に変更する処理を書いてください

するとgTTSを含む複数のライブラリについて触れた上で、最初のライブラリのサンプルが表示されるのでgTTS(Google Text-to-Speech)のサンプルで聞き直す。
これにした明確な理由はありません。なんとなくです。
次を入力
gTTSを使った例を示してください

前後しばらくの文脈は読み取ってくれるので口語調で聞いていって大抵は問題ないです。
そしてこの出力の時点でもう動くはずです。

ModuleNotFoundError: No module named...

となった人。参考記事を見てpip installしてください。
どうでしょう。再生されたでしょうか?
さて、英語調が気になったのと1回しか入力できなかった点を修正したいので
次を入力
日本語の音声にしてください。 またテキスト入力は連続してできるようにループにしてください。

この時点でこんな出力になっていました。

from gtts import gTTS
import os

def text_to_speech(text, lang='ja'):
    tts = gTTS(text=text, lang=lang)
    tts.save("output.mp3")
    os.system("start output.mp3")

# テキストを入力して音声に変換するループ
while True:
    input_text = input("変換したいテキストを入力してください(終了するには'exit'と入力): ")
    if input_text.lower() == 'exit':
        print("プログラムを終了します。")
        break
    text_to_speech(input_text)

exitで終了コードまでつけてくれました。
もうこの時点で要件満たしてますね。
5分以内達成おめでとうございます!
...
物足りないですよね?
なんか音声プレイヤーが手前にきて入力の邪魔してくるし、読み上げが遅い。
もうちょっと改善しましょう。まだ5分まで時間あります。
音声再生ウィンドウが手前に出て入力の邪魔になるので出ないようにして
再生速度を1.5倍にしてください。

このあたりを組み合わせていて気付きました。
入力をあわせていても再現性が完全ではないということを。
このあたりは不確定な要素が含まれているのか、自分のアカウント自体の過去のやり取りもいくらか影響しているのか、モデル自体がフィードバックがあるのか私は知りませんが、一つ言えるのは同じ質問内容でも同じコードが得られるとは限らないということです。
なんだか旬の野菜を目利きしているような気分になります。
さて、3分クッキング方式になっちゃいましたがエラーとフィードバックを何回かやりとりして下記のコードにたどり着きました。

import time
import os
import pygame
from gtts import gTTS
from pydub import AudioSegment

def text_to_speech(text, language='ja', speed=1.0):
    tts = gTTS(text=text, lang=language)
#    file_name = f"output_{int(time.time())}.mp3"  # 現在の時刻を使ってファイル名を生成
    file_name = f"output.mp3"
    tts.save(file_name)
    
    # 再生速度を変更
    sound = AudioSegment.from_mp3(file_name)
    sound = sound.speedup(playback_speed=speed)
    sound.export(file_name, format="mp3")
    
    return file_name

def play_audio(file_name):
    pygame.mixer.init()
    pygame.mixer.music.load(file_name)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        pygame.time.Clock().tick(10)  # 再生が終了するまで待機
    pygame.mixer.music.stop()
    pygame.mixer.quit()

if __name__ == "__main__":
    pygame.init()
    speed = float(1.2)
    print("音声化を開始します")
    while True:
        text = input("=>")
        if len(text) > 0:
            file_name = text_to_speech(text, speed=speed)
            play_audio(file_name)
        time.sleep(1)

pydub,pygame,ffmpeg等追加のインストールが必要です。ffmpegは少しだけ面倒でした。
実際、ここにたどり着くのは5分じゃダメでした。けどまぁ自分的には許容範囲内です。

所感

パワーでごり押しするパワー系エンジニアリングをしてみました。
普段私はパワー系ではありません。
もちろんGPTすごいなぁという感想もありつつ、例えばこの程度のコードは時間をかければ自分でもかけるので、メリットは時短なのかなと思ってます。
私は仕事がら決まった開発言語がなく、pythonだって1か月ぶりとかざらにあります。そういう環境だと簡単なコードでも文法やライブラリ、テクニックなど思い出しや調べものに時間がかかって生産性が落ちること良くありました。
そういう立場の人間にするとけっこうありがたいなぁと思う一方、仮にエンジニアリングの欠片もない人がばりばりコード作っていけるようになるかというとそれは違うのかなぁ?とも思ったりしています。
後、ベースのエンジニアリングはあったほうがよくて、エラー対処や別の方法模索の場合も何を聞いて良いかや聞くのと自分で考える部分とかはやはり出てきます。
なので両方を併用するというのがベスト、というふうに判断しました。

注意

生成結果で得られた処理が使うサービスやライセンス、利用料金等に注意してください。
仮にあなたが考えたコードでなくても出力したのは他でもないあなた=私ですからね。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?