【SwiftUI】ChatGPTと同じモデルで音声対話アプリをつくる。

## はじめに
最近、流行りのChatGPTを使ってみましたが、[ChatGPTがコードレビュー](https://qiita.com/gon_kojiri/items/87e9562c0d8a0d37341a)してみたり、[記事を書いた](https://qiita.com/minorun365/items/a830ba65158c7df688d6)りと、自然言語生成モデルなどに詳しくない自分としては衝撃を受けました。

そんなChatGPTですが、ChatGPTが搭載しているのと同じ言語モデルである`GPT-3`を、OpenAIのAPIから利用できるみたいです。([この記事](https://qiita.com/Tyamamoto1007/items/464e142c2d88d314ab6c)を拝見するまでは、ChatGPTの認識がずれていました）
そのためこの記事では、ChatGPTのような対話を音声対話で実行できるようなiOSアプリを作る過程での、`GPT-3`との連携部分をまとめました。

下図は、「スウィフトで足し算する関数を教えて」の発話内容に対して、OpenAIのAPIからの返答として、実際のSwift言語の「足し算する関数」を受け取っている様子です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655077/4df3d1a6-687d-3f73-2428-fd79d0041a59.gif" width="300">
※「Swift」で認識されず、「スウィフト」になっています。

## GitHub
https://github.com/mlballack/SpeechChatGPTWithSwiftUI/tree/main

## GPT-3との連携
冒頭でも述べましたが、ChatGPTと同じ言語モデルである`GPT-3`をOpenAIのAPIを介して利用できます。
今回は、OpenAIのHTTP APIライブラリである`OpenAISwift`を利用して、GPT-3系の言語モデルを利用します。

##### 1. OpenAIでAPI KEYの発行
まず、GPT-3を利用するために、「OpenAI - User - API Keys」の「+ Create new secret key」からAPI KEYを作成します。
![pub_apikey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655077/c27a8180-1bda-030b-14c1-d5227b13f4b3.png)

##### 2. XcodeのSPMでOpenAISwiftをインポート
下記URLからOpenAISwiftをSPMでインポートします。
[GitHub - OpenAISwift](https://github.com/adamrushy/OpenAISwift)

##### 3. OpenAISwiftの実装部分
まず、プロジェクト内に`OpenAISwift`をインポートします。
```swift
import OpenAISwift
```
次に、引数`authToken`に「1. OpenAIでAPI KEYの発行」にて発行したAPI keyを記述し、OpenAISwiftのインスタンスを作成します。
```swift
client = OpenAISwift(authToken: "ここにAPI KEY")
```
利用する際には、下記のように関数`sendCompletion`の引数に質問したいテキスト`text`と最大トークン数`maxTokens`を指定してください。
```swift
client?.sendCompletion(with: text, maxTokens: maxTokens, completionHandler: { result in
    switch result {
    case .success(let success):
        let text = success.choices.first?.text ?? ""
        break
        
    case .failure(let failure):
        break
    }
})
```

## 最後に
今回作ったアプリで「プログラマーが活躍する方法」について聞いてみました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655077/230cf708-4654-522f-6f64-e88155b75920.png" width="300">
精進します。。
間違いなどありましたら、ご指摘いただければと思います。

## 参考URL
##### 【音声録音】
- [WebSocket + AVAudioEngineを駆使してApple Watchでリアルタイム音声認識してみた](https://amivoice-tech.hatenablog.com/entry/2021/06/14/123000)
##### 【音声認識】
- [iOS App Dev Tutorials - Transcribing speech to text](https://developer.apple.com/tutorials/app-dev-training/transcribing-speech-to-text)
- [【Xcode】【SwiftUi】簡単！音声認識（文字起こし）（リアルタイム）](https://note.com/moss_it/n/n7e30658d3a4e)
##### 【音声合成】
- [【Swift5】 iOSで利用できる標準の音声合成(AVSpeechSynthesizer)の使い方のメモ](https://qiita.com/maKunugi/items/dc9da201a663c8773c8c)
##### 【ChatGPT / GPT-3】
- [OpenAI - Documents - API Reference - Completions](https://platform.openai.com/docs/api-reference/completions)
- [GitHub - OpenAISwift](https://github.com/adamrushy/OpenAISwift)
- [【Xcode/Swift】SwiftUIでChatGPTを使う方法](https://ios-docs.dev/swiftui-chatgpt/)
- [ChatGPTを使ったアプリ(サービス)、ChatGPTじゃない説](https://qiita.com/Tyamamoto1007/items/464e142c2d88d314ab6c)
- [この記事はすべてAIが書いています。](https://qiita.com/minorun365/items/a830ba65158c7df688d6)
- [ChatGPTにコードレビューしてもらったらサンドバッグにされた件](https://qiita.com/gon_kojiri/items/87e9562c0d8a0d37341a)
- [ChatGPTが出たのでVRChatに音声対話型AI Botを作った。](https://qiita.com/GesonAnko/items/3789e87ff30a3a08e3dd)
- [【GPT-3】PythonでGPT-3を用いてChatGPT風のコマンドラインツールを作ろう！](https://aiacademy.jp/media/?p=3559)