【メモ】音声読み上げアプリを作成 (再生速度調整を追加)

スポンサーリンク
Python/DeepLearning

こんにちは!みやしんです。

今回は以前作った音声読み上げアプリを少し改造して再生速度を調整する機能を追加しましたのでメモとして残しておきます。

スポンサーリンク

やったこと

  • 音声を速度調整するために「librosa」ライブラリをインストール
  • librosaで速度調整したデータをmp3で保存するために「soundfile」ライブラリをインストール
  • GUIに音声速度を調整する部分を追加
  • pyinstallerでEXE化して発生したエラー対策

サンプルコード

import PySimpleGUI as sg
from gtts import gTTS
import librosa
import soundfile as sf

def gui():
    # ウィンドウのテーマ
    sg.theme('DarkBrown2')
    
    # ウィンドウの内容を1列ずつ定義
    layout = [  [sg.Text('文章を音声に変換するアプリです')],     # テキスト設置
                [sg.Multiline('文章を入力してください', size=(80, 20), key='sentence')], # 文章入力欄を設置
                [sg.Text('出力ファイル名(.mp3)')],
                [sg.InputText(default_text='speech_file', size=(80, 1), key='file_name')], # 出力ファイル名を入力する
                [sg.Text('言語設定')],
                [sg.Spin(['日本語', '英語'], size=(10,1), initial_value='日本語', key='language')], # jaが日本語、enが英語
                [sg.Text('再生速度倍率')],
                [sg.Input(1.0, size=(6, 1), key='speed')], # 出力ファイル名を入力する
                [sg.Button('音声に変換する', key='bt')] ] # ボタンを設置
    # ウィンドウを作成する
    window = sg.Window('音声合成アプリ', layout)      # ウィンドウ定義

    while True:
        # ウィンドウを表示
        event, values = window.read()

        if event == 'bt': # ボタンを押したとき
            message = text_to_speech(values['sentence'], values['file_name'], values['language'], values['speed']) # Text to Speechを実施
            sg.Popup(message, title='音声変換結果') # 処理結果をポップアップでお知らせ
        
        elif event == sg.WIN_CLOSED: # window右上の×印を押して閉じたとき
            break

    # 画面から削除して終了
    window.close()  # ウィンドウを閉じる


def text_to_speech(sentences, file_name, language, speed):
    '''
    Text to Speechを実施する関数
    <入力>
        sentences:テキスト文章 (str)
        file_name:出力ファイル名 (str)
        language:日本語 or 英語 (str)
        speed:再生速度 (float)
    <出力>
        message:処理結果 (str)
    '''
    try:
        # Text To Speech
        if language == '日本語':
            tts =gTTS(text=str(sentences), lang='ja')
            tts.save(str(file_name)+'.mp3')
        else:
            tts =gTTS(text=str(sentences), lang='en')
            tts.save(str(file_name)+'.mp3')
        
        # 再生速度の調整
        sr = 48000 # フレームレート 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, and 48000
        y, _ = librosa.load(str(file_name)+'.mp3', sr=sr)
        y_change_speed = librosa.effects.time_stretch(y, rate=float(speed))
        sf.write(str(file_name)+'.mp3', data=y_change_speed, samplerate=sr)
        
        message = '音声変換が終了しました'
    except PermissionError:
        message = 'ファイル出力が出来ませんでした。出力ファイル名を変更、もしくは音声の再生ウインドウが開いている場合は閉じてください。'
    return message


if __name__ == '__main__':
    gui()

librosa と soundfile をインストール

pip install librosa
pip install soundfile

EXE化実行

下記のコマンドでEXE化

pyinstaller --onefile --collect-data librosa --noconsole --icon=[アイコンファイル名.ico] [Pythonファイル名.py]

エラー対応

Python3.10だとエラー発生

どうやらpython3.10だとPyinstallerでエラーが出るようです。(何のエラーか忘れました)

python3.9.13で環境構築しなおしました。

setuptoolsモジュールがないよ!と怒られる

setuptoolsをインストール&アップグレードしました。

pip install setuptools
pip install --upgrade setuptools

FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users\owner\AppData\Local\Temp\_MEI255162\librosa\util\example_data\registry.txt’

registry.txtがないよ!と怒られました。

FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users\owner\AppData\Local\Temp\_MEI255162\librosa\util\example_data\registry.txt’

これはpyinstallerでEXE化する際にコマンドに「–collect-data librosa」を加えると解決できました。

–collect-data MODULENAME で、指定したパッケージまたはモジュールからすべてのデータを収集してEXE化してくれるそうです。

最終的には、前述しましたが下記のコマンドでEXE化しました。

pyinstaller --onefile --collect-data librosa --noconsole --icon=[アイコンファイル名.ico] [Pythonファイル名.py]

こちらのページが参考になりました。

Using PyInstaller — PyInstaller 6.1.0 documentation

こんな感じのGUIになって、mp3の速度調整機能が追加されました。

以上です!

Python/DeepLearning
スポンサーリンク
記事が良かったらSNSでシェアを宜しくお願いします!
みやしんをフォローすると役立つ情報がいっぱいにゃ!
スポンサーリンク
みやしんのプログラミングスキル通信

コメント

タイトルとURLをコピーしました