音声文字起こしと応答生成ボットの作成

# イントロ

こんにちは！
今回は、音声を文字起こしし、GPT-3.5を使用して応答を生成し、その応答を音声に変換するPythonベースのボットの作成方法をご紹介します。
このボットは、インタラクティブな音声ベースのアプリケーションを作成するのに役立ちます。

# Github
[音声文字起こしと音声対話ボット](https://github.com/yayoi-exe/audio-chat-bot)

# 機能

このボットには以下の機能があります：

- マイクから音声入力を記録
- OpenAIのWhisperモデルを使用して音声をテキストに変換
- GPT-3.5を使用してテキスト応答を生成
- 生成されたテキストを音声に変換
- 変換した音声を再生

# 必要なもの

- Python 3.9.19
- OpenAI APIキー

# インストール手順

## 1. リポジトリのクローン

まず、リポジトリをクローンします。

```bash
git clone https://github.com/yayoi-exe/audio-chat-bot.git
```

フォルダに移動します。

```bash
cd audio-chat-bot
```

## 2. 必要なパッケージをインストール

次に、必要なPythonパッケージをインストールします。

```bash
pip install -r requirements.txt
```

## 3. OpenAI APIキーの設定
OpenAI APIキーを設定するために、プロジェクトのルートディレクトリに .env ファイルを作成し、以下のようにAPIキーを追加します。

``` env
OPENAI_API_KEY="your_openai_api_key_here"
```

# プログラムの説明

## 1. メインスクリプトの実行

以下のコマンドでメインスクリプトを実行します。

```bash
python main.py
```

## 2. 音声の記録と応答の生成

スクリプトを実行すると、以下のメッセージが表示されます：

```plaintext
Press Enter to start/stop recording or 'q' to quit...
```

- Enterキーを押すと録音が開始されます。
- 再度Enterキーを押すと録音が停止され、音声ファイルが保存されます。
- 録音が停止すると、音声がテキストに変換され、GPT-3.5を使用して応答が生成されます。
- 生成された応答は音声に変換され、再生されます。
- 終了したい場合は、q を入力してください。

# プログラムの詳細

## 音声の録音

sd.InputStream を使用して音声を録音します。
録音データはキューに保存され、別のスレッドでファイルに書き込まれます。

```python
with sd.InputStream(
    callback=lambda indata,
    frames,
    time,
    status: audio_callback(indata, frames, time, status, q),
    channels=1,
    samplerate=sample_rate,
    dtype='int16'
):
    # 録音処理
```

## 音声の文字起こし

録音された音声ファイルをOpenAIのWhisperモデルを使用して文字起こしします。

```python
def transcribe_audio(filename):
    try:
        with open(filename, "rb") as audio_file:
            transcription = openai.audio.transcriptions.create(
                model="whisper-1",
                file=audio_file
            )
        return transcription.text
    except Exception as e:
        print(f"Error transcribing audio: {e}")
        return None
```

## 応答の生成

文字起こしされたテキストをGPT-3.5を使用して応答を生成します。

```python
def generate_response(prompt):
    try:
        response = openai.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "短文で会話を続けてください。"},
                {"role": "user", "content": prompt},
            ],
            max_tokens=50
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"Error generating response: {e}")
        return None
```

## テキストの音声変換

生成されたテキストを音声に変換します。

```python
def text_to_speech(speech_file_path, text):
    try:
        with openai.audio.speech.with_streaming_response.create(
            model="tts-1",
            voice="alloy",
            input=text
        ) as response:
            response.stream_to_file(speech_file_path)
    except Exception as e:
        print(f"Error converting text to speech: {e}")
```

## 音声の再生

生成された音声ファイルを再生します。

```python
try:
    data, samplerate = sf.read(speech_file_path)
    sd.play(data, samplerate=samplerate)
    sd.wait()
    print("Speaking...")
except Exception as e:
    print(f"Error playing speech: {e}")
```

# プロジェクト構成

プロジェクトのディレクトリ構成は以下の通りです：

- main.py: ボットを実行するメインスクリプト
- .env: 主にOpenAI APIキーを保存するための環境変数ファイル
- requirements.txt: 必要なPythonパッケージのリスト

# エラーハンドリング

このスクリプトには、以下のような問題を管理するための包括的なエラーハンドリングが含まれています：

- 不足または無効なAPIキー
- 音声記録エラー
- APIコール失敗
- ファイルの読み書きエラー

# まとめ

このボットを使って、音声ベースのインタラクティブなアプリケーションを簡単に作成してみてください。
ご質問やフィードバックがあれば、コメントでお知らせください！