音声録音ページ(CGI+Python)

Chat GPTにお願いして、音声を録音してくれるWebページのプログラムを作成してもらいます。

ポイント

最初投げかけたとき、どうしてもFlaskを使いたがるので(レンタルサーバはFlask非対応)、Flaskを使わないようにお願いしています。
また、2段階でお願いしています(2段階目=「ユーザーごとにファイル名を分けて」)。こうすることで、Chat GPTがスムーズになります。

Chat GPTに投げかけた言葉

最初のお願い

以下のプログラムを作ってください。

プログラム:"""
* CGIでWebページを作る。CGIはサーバーに許可されています。
* ユーザーがアクセスするページは「index.cgi」。Flaskを使用しないで下さい。
* Webページにボタンが1つある。ボタンのキャプションは「録音開始」
* ボタンを押すとマイクが起動し、録音を開始する。また、ボタンのキャプションを「録音停止」にする。
* そのボタンを押すまで録音が続き、ボタンを押すと録音を停止して、キャプションを「録音開始」にする。
* 録音された音声を「onsei.wav」として保存する。
"""

ちょっと修正のお願い

ユーザーごとにユニークなファイル名にするには?
ただし、そのファイル名は複数回録音しても変わらないものとします。

うまくいかなかったので、修正のお願い

Cookieが取得できません。「cookie.get("user_id")」で、常にNoneとなります。


作ってくれたプログラム

ちょっとだけ自分で修正しています。

<修正箇所>

<修正箇所>
- ユーザーIDを加工(userid=str(usr_id).split("="))
- HTML文のところを、「print("""---""")」を「print(f"""---""")」に
(useridを出力させたため)

#!/usr/bin/env python3

import os
import cgi
import wave
import base64
import tempfile
import http.cookies
import uuid


# クッキーを読み込む
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
user_id = cookie.get("user_id")

# クッキーが存在しない場合、新しいユーザーIDを生成
if user_id is None:
    user_id = str(uuid.uuid4())
    cookie["user_id"] = user_id
    cookie["user_id"]["path"] = "/"
    cookie["user_id"]["expires"] = 31536000  # 1年間有効にする
    print(cookie)  # クッキーを設定するためのHTTPヘッダーを出力

userid = str(user_id).split("=")[-1]



# フォームデータを取得
form = cgi.FieldStorage()

# 録音データを取得
recording = form.getvalue("recording")

if recording:
    # 録音データをデコード
    wav_data = base64.b64decode(recording.split(",")[1])

    # 録音データをファイルに保存
    with open(f"onsei_{userid}.wav", "wb") as f:
        f.write(wav_data)
        
        

print("Content-Type: text/html\n")


# HTMLとJavaScriptを出力
print(f"""
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>録音アプリ</title>
    <script>
        let recording = false;
        let mediaRecorder;
        let chunks = [];

        function startRecording() {{
            navigator.mediaDevices.getUserMedia({{audio: true}})
                .then(stream => {{
                    mediaRecorder = new MediaRecorder(stream);
                    mediaRecorder.start();

                    mediaRecorder.ondataavailable = e => {{
                        chunks.push(e.data);
                    }};

                    mediaRecorder.onstop = () => {{
                        const blob = new Blob(chunks, {{type: 'audio/wav'}});
                        chunks = [];
                        const reader = new FileReader();
                        reader.readAsDataURL(blob);
                        reader.onload = () => {{
                            document.getElementById("recording").value = reader.result;
                            document.getElementById("uploadForm").submit();
                        }};
                    }};
                }});
        }}

        function toggleRecording() {{
            const button = document.getElementById("recordButton");
            if (recording) {{
                button.textContent = "録音開始";
                mediaRecorder.stop();
            }} else {{
                button.textContent = "録音停止";
                startRecording();
            }}
            recording = !recording;
        }}
    </script>
</head>
<body>
    <form id="uploadForm" method="post" enctype="multipart/form-data">
        <input type="hidden" id="recording" name="recording">
    </form>
    <button id="recordButton" onclick="toggleRecording()">録音開始</button>
    <p>{userid}</p>
</body>
</html>
""")


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