見出し画像

【Python】今日も戦ってました

皆さんどうも。おはばんちゃ(´・ω・`)ノシ
HaruAkiです。

プライベートは「引越し準備」
本業は「Python」

そんな最近を過ごしてます。

引越しの話題はさておき
今日もずっとPythonと戦っていましたので
以降、最近のPython事情でも
綴ってみようと思います。


「音声入力プログラム」完成


一昨日だったかな。
HaruAki、初めての
Pythonプログラムが完成しました。

一応、まともに動きます。
exeにしたうえで
他PCでも確認しました。

exe自体の起動や処理時間も
今んところ問題なさそう。

中身はこんな感じです。


import speech_recognition as sr
import keyboard

print("「音声入力プログラム」です")
print("")
print("入力したい箇所にカーソルを合わせてください")
print(" → 「Word」「Excel」は、改行処理に多少の不具合が生じます")
print(" → 「メモ帳」に書き出すのがオススメです。")
print("")
print("1文ごとに処理します。適度に区切りながら発声してください")
print("「音声を受け付けています・・・」の後に発声してください")
print("")
print("「スタート」の発声で書き込みを開始します")
print("")

r = sr.Recognizer()

# 音声認識感度設定
r.energy_threshold = 2000  # 認識声音量(デフォルト400)
r.phrase_threshold = 0.3  # フレーズの区切り間隔(デフォルト0.3秒)
r.pause_threshold = 0.8  # 無音認識(録音終了まで)の長さ(デフォルト0.8秒)


#プログラム起動後、スタート待機処理
while True:
    try:
        print("音声を受け付けています・・・")
        print("")
        #マイクが開く
        with sr.Microphone() as source:
            r.adjust_for_ambient_noise(source)
            audio = r.listen(source) 
            #マイクが閉じる 
            print("マイクを閉じました")
            print("認識音声を変換しています・・・")
            print("")
            print("")
            text = r.recognize_google(audio, language='ja-JP')
            print(text)
            print("")
            print("")

        if "スタート" in text:
            print("「スタート」を認識しました。入力を開始します")
            print("")    
            #text =""
            break
        else:
            print("「スタート」発声待機中です")
            print("入力を開始するには、まずカーソルを合わせてください")
            print("「スタート」の発声で入力を開始します")
            print("")
            continue

    except sr.UnknownValueError:
        pass
    except sr.RequestError as e:
        print("エラー:プログラムを終了します")

#While ループに戻る(スタート待ち)

#スタート発声後、ループ処理
while True:    

    print("【各種発声コマンド】")
    print("スペース → 発声「マージン」")
    print("改行   → 発声「ネクスト」")
    print("1行開ける → 発声「オープンライン」")
    print("一時停止 → 発声「ポーズ」")
    print("")
    print("終了する場合は、右上の「×」をクリックしてください")
    print("")
    print("音声を受け付けています・・・")
    print("")

    #マイクが開く
    with sr.Microphone() as source:
        r.adjust_for_ambient_noise(source)
        audio = r.listen(source) 
    #マイクが閉じる
        print("マイクを閉じました")
        print("認識音声を変換しています・・・")
        print("")
        print("")

    #認識音声をクラウド経由でGoogle側に送信し、変換結果を受け取る
    #Google側の仕様上、文中に半角スペースが入ってしまう
        #日本語の文法仕様ではなく、英語文法に依存? = 単語区切り)
        #「、」「。」「‐」に対応していない

    try:
        text = r.recognize_google(audio, language='ja-JP')
        print(text)
        print("")
        print("")

        #スペース入力処理
        if "マージン" in text:
            text = text.replace("マージン", "")
            keyboard.write(text)
            keyboard.press_and_release('space')
            continue

        #任意改行処理
        elif "ネクスト" in text or "NEXT" in text:
            text = text.replace("ネクスト", "")
            text = text.replace("NEXT", "")
            keyboard.write(text)
            keyboard.press_and_release('enter')
            continue
            #改行処理を入れるとなると、入力するソフトに依存する
            #Enterで改行のソフトもあれば、そうじゃないソフトもある)
            #入力者の任意での改行の方が、汎用性が高くなる)

        #1行開けて改行したいとき
        elif "オープンライン" in text or "OPEN LINE" in text:
            text = text.replace("オープンライン", "")
            text = text.replace("OPEN LINE", "")
            keyboard.write(text)
            keyboard.press_and_release('enter')
            keyboard.press_and_release('enter')
            continue      

        elif "ポーズ" in text:
            print("「ポーズ」を認識しました。入力を一時停止します")
            print("")    
            text = text.replace("ポーズ", "")
            keyboard.write(text)
            keyboard.press_and_release('enter')
            print("再開するには「リトライ」と発声してください")
            print("")

            #発声「リトライ」待機ループ処理            
            while True:
                with sr.Microphone() as source:
                    r.adjust_for_ambient_noise(source)
                    audio = r.listen(source)

                    try:
                        text = r.recognize_google(audio, language='ja-JP')
                        print(text)
                        print("")
                        print("")

                        if "リトライ" in text:
                            print("「リトライ」を認識しました。入力を再開します")
                            print("")    
                            text =""
                            break
                        else:
                            print("ポーズ中です。入力は行いません")
                            print("入力を再開するには「リトライ」と発声してください")
                            print("")
                            print("")
                            continue

                    except sr.UnknownValueError:
                        pass
                    except sr.RequestError as e:
                        print("エラー:プログラムを終了します")
            #While ループに戻る(リトライ待ち)

        #「else」は省略        
        #上記KWが無ければ認識したまま(Google側変換結果)を入力する
        #「確定入力」として処理する(文字列の変換は行わない)
        #ソフト側の相性によって、文字変換状態になる場合がある

        #「IF」に当てはまらなければ、textをそのまま入力する
        #while冒頭に戻る(ループ)
        keyboard.write(text)

    #無音や発言がない場合の例外処理
    except sr.UnknownValueError:
        pass

    #何かしらのエラーが起きた場合の処理
    except sr.RequestError as e:
        print("エラー:プログラムを終了します")
        break

#While ループに戻る(音声入力再受付へ)

張り付けてみると、長いですね。
初めての割にはよくやった(笑

これもひとえに
「chatGPT先生」のおかげです。

先生6割
HaruAki4割

そんくらいの割合かな。

大まかなプログラム
組んでくれるのはありがたいですが
とはいえ
全くの初心者では、応用や修正が効きません。

なのでそこらへん、
自分なりにわからないところを明確にして
そこだけピンポイントで修正していく
そんな作業が必要になります。

学生時代に
VBAなり学んでおいたのが
ほんとでかいですね。

HaruAki、Python触れ初め
まったくの知識ゼロってわけではなかったので
そこら辺のアドバンテージは感じてました。

ただまぁ、Pythonここまでやって思うのは
Pythonはコード書くことより
「環境構築」
なによりの壁であることを
つくづく感じているここ数日です。


動いたプログラムが動かなくなる


なんか知らんが
本当にこのケースが多い。

今日もそうだった。

音声入力プログラムが完成して
その次にとりかかったのが
「音声文字起こしプログラム」

動画やら音声データを
一時的にwavに変換し
そこからテキスト化するっていう
そんなプログラムに着手しました。

で、今日完成したんですよ。

で、早速exeして
他の環境で実行してみましたが
何故か即終了する。。。

「あぁ、モジュールインストしてないのか!」

HaruAki、現在のPython作成については
仮想環境を2つに切り分けて
行っています。

具体的には
作成環境の「python_cre」
exe出力環境の「python_inst」

上記2つの環境を切り替えて
作成とexe化を使い分けてます。

ローカルにはインストせず
完全に仮想環境でやるようにしてます。
理由は以前の記事の通り。

でまぁ、creで作成したプログラムを
instにコピーしてexe化

その際に、
文字起こしプログラムに必要なモジュールを
inst側にインストールしてなかったわけですね。

なので、インストして
その上で実行してみましたが
やはりなぜか立ち上がらない。。。

検証のため、
再度、cre環境で実行してみるも

・・・動かない!!!

(´・ω・`) え?なんで???

(´・ω・`) 5分、10分前まで動いてましたよね????

(´・ω・`) 5分、10分前、無事プログラム動いて、
(´・ω・`) 喜んでましたよね?僕。。。

(´・ω・`) ・・・・なんで?・・・

作成環境。VScordつかってます。

よくよく見てみると
ファイル名がなんか「黄色」になっている。。。

(´・ω・`)y-~~ 明らかに、なんかおかしい。

(´・ω・`)y-~~ モジュール読み込んでない。

(´・ω・`)y-~~ 俺、悪くない!!!

(´・ω・`)y-~~ VScordがバk(ry


そんなこんなで
VScord側の
設定の問題であることがわかりました。

ほんとそういうことが多い。


環境理解がマジで難しい


というのも
まだまだ環境設定については
分からんところが多すぎるわけです。

その都度、検索かけてるのですが
どうしてもピンとすぐにわかる記事
そうないんですよね。

ほぼほぼ初心者のHaruAkiからすれば

「みんな、Python知ってる立場での書き方だよねそれ」

っていうものが本当に多い。
VBAとかかじってる自分ですらそう思うんだから
まじでプログラミング未経験から始める人には
相当ハードル高いと思う。

とはいえ、
HaruAki自身の理解力の低さが
何よりの問題なので
他人の記事のわかりにくさを批判することより
また明日から
とことんちまちまと
自分のわからないところ
潰していくしかないですね。

独学ってそういうもんだと思います。

プログラム自体は完成しているので
なんとか明日のうちに
文字起こしプログラム。
exe化したいです。。。。


・・・・・

「settings json」
「launch.json」

ここら辺の理解が必要ですね。

とりあえず

「settings json」ってのが
VScord自体の設定

「launch.json」
ってのが
プロンプト(ターミナル?)とか
デバッグを行う環境の設定

その違いは今日把握しました。

ただここら辺、
先月PHPもやっていたこともあり
その時の設定の名残もあるので
なかなか簡単には行かない。

PHP関連の設定
一度ぶっ壊してもいいんですが
以降はPythonもPHPも
VScordで扱っていきたいと思っているので
可能な限り
ちゃんと理解して設定したい思いが強いです

ただなにぶん、

マジで意味わからない!!!

具体的には「settings.json」

仮想環境を立てた場合
VScordは
モジュール参照先を頻繁に見失うので
「python.analysis.extraPaths」にて
仮想環境のモジュール保存ファイルを
パス指定してあげる必要があることは
今日学びました。

ただHaruAkiがつまづいているところは

複数の仮想環境を扱っている場合
毎回毎回、書き替えないといけないのこれ!?

っていう、そういう疑問。

実行やデバッグの際に
「モジュールが見つからない」
ってときに
この対応が必要になるわけですが
検索して出てくる記事ってのは
単に1つの仮想環境に対しての対処法なので
複数環境を使い分ける際の
settings.jsonの扱い方について
触れてくれている記事が見当たらんのですよね。

ぶっちゃけ
いちいち毎度毎度書きかえるなんていう
そんな面倒なこと、
しなくていいような書き方があると思ってます。

ただHaruAkiは
そもそもこうした設定ファイルについて
全く理解ができていないので
漠然とそういう疑問が思い浮かびます。。。

結局今日、
プログラムが完成して
exe化したけど動かなかったってのは
「cre」と「inst」の
仮想環境の違いに起因する問題なのかな?
とか勝手に思い込んでます。

それぞれに必要なモジュール。
pip install はしてあるけど
VScord側の設定には全く触れていないので
それでモジュール参照先が迷子になっている
そういう状況なのかなと思ってます。


(´・ω・`) この疑問、切実です。。。。

明日は朝からこの問題に取り組みます。
この問題解決できずに
1日終わる気がしてますwww

もしここまで読んでくれた
Python経験者の方、
いましたら
是非ともコメントで教えてください!!

そもそもHaruAkiは
どこからググるべきなのか?
何を知るべきなのか?
何を誤解しているのか?

そういうところ知りたいです。

ほんとPythonはこれが難しい。。。

環境構築、環境理解。
マジで難しいです。

イライラ、ブツブツ言いながらやってますが
とはいえ、面白いんですけどね。

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?