Slide 1

Slide 1 text

Realtime API 入門 藤門 莉生(Rio Fujimon)

Slide 2

Slide 2 text

自己紹介 藤門 莉生(Rio Fujimon) - Sansan株式会社 - 23卒(新卒2年目) - Eight の iOSアプリを開発 - X(旧 Twitter):@RioFujimon - iOS開発で主に興味がある領域 - UIKit, SwiftUI - Bluetooth, NFC, Audio, etc

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Realtime API 紹介文 開発者はアプリケーションに 高速な音声合成体験 を組み込めるようになった

Slide 5

Slide 5 text

Realtime API 登場以前の手法 Whisper 音声を テキストに 書き起こす テキスト 解析モデル 目的の 応答を生成

Slide 6

Slide 6 text

Realtime API 登場以前の問題 Whisper 音声を テキストに 書き起こす テキスト 解析モデル 目的の 応答を生成 プロセス全体で感情やアクセントが失われたり、遅延が発生

Slide 7

Slide 7 text

Realtime API を利用した場合 Whisper 音声を テキストに 書き起こす テキスト 解析モデル 目的の 応答を生成 Realtime API

Slide 8

Slide 8 text

実装を見ていく 󰳕

Slide 9

Slide 9 text

まずはRealtime API のチュートリアル 🔰

Slide 10

Slide 10 text

公式のドキュメントは JavaScript の例しか載ってない 😭 https://platform.openai.com/docs/ guides/realtime#overview 自力で読み解いて Swift で書き直す or AIツールを利用して Swiftで書き直す

Slide 11

Slide 11 text

💡 要点 ・URLSessionWebSocketDelegate を利用 ・urlSession(_, webSocketTask:, didOpenWithProtocol:) で以下を記述 ・URLSessionWebSocketTask.Messageを作成 ・URLSessionWebSocketTask の send()で送信 ・receiveMessage() でWebSocketを利用したデータ受信

Slide 12

Slide 12 text

💡 要点 ・URLSessionWebSocketTask の receive() で受信 ・URLSessionWebSocketTask.Message として取得 ・.string(String) と .data(Data) で取得可能

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

実行してみる ▶

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

😵 様々な形式の JSONデータが返却されてよく分からん

Slide 19

Slide 19 text

🖐 JSONの重要な部分を見てみる

Slide 20

Slide 20 text

JSONデータを1行取り出してみる 👀 - type: response.text.delta - delta: 【差分のテキスト文】

Slide 21

Slide 21 text

別なJSONデータを1行取り出してみる 👀 - type: response.text.done - text: 【テキストの完全文】

Slide 22

Slide 22 text

💡 要点 ・JSON から type を取得 ・type で場合分けを実施 ・response.text.delta の場合、 delta を取得して表示 ・response.text.done の text を取得して表示

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

🗣 会話の内容を変更する

Slide 25

Slide 25 text

💡 要点 ・type を指定することで Client からのイベントが変更可能 ・type の種類 ・conversation.item.create の場合、会話内容を追加 ・response.create の場合、レスポンスの生成 を指示

Slide 26

Slide 26 text

会話・質問の内容を変えることに成功 🎉

Slide 27

Slide 27 text

テキストは、無事に扱えるようになった 🎉

Slide 28

Slide 28 text

音声データはどう取得するの? 🧐

Slide 29

Slide 29 text

💡 要点 ・modalities に audio を指定

Slide 30

Slide 30 text

JSONデータを1行取り出してみる 👀 - type: response.audio.delta - delta: 【base64エンコードされた逐次の音声データ】

Slide 31

Slide 31 text

別なJSONデータを1行取り出してみる 👀 - type: response.audio_transcript.delta - delta: 【トランスクリプトの差分】

Slide 32

Slide 32 text

別なJSONデータを1行取り出してみる 👀 - type: response.audio_transcript.done - transcript: 【トランスクリプトの完全文】

Slide 33

Slide 33 text

💡 要点 ・JSON から type を取得 ・type で場合分けを実施 ・response.audio.delta の場合、 delta を表示 ・response.audio_transcript.delta の delta を表示 ・response.audio_transcript.done の transcript を表示

Slide 34

Slide 34 text

音声データの取得が行えるようになった 🎉

Slide 35

Slide 35 text

本日話した内容 目的の 応答を生成 Realtime API

Slide 36

Slide 36 text

残っている内容 目的の 応答を生成 Realtime API AVFoundation(AVAudioEngine, AVAudioSession)で扱う

Slide 37

Slide 37 text

AVFoundationの 部分をお話する予定 ご参加 お待ちしてます 🙏 connpassのリンクは こちら

Slide 38

Slide 38 text

【参考】 Realtime API のライブラリも 開発されているみたい https://github.com/m1guelp f/swift-realtime-openai

Slide 39

Slide 39 text

- https://openai.com/index/introducing-the-realtime-api/ - https://platform.openai.com/docs/guides/realtime?text-generation-quickstart-e xample=stream - https://platform.openai.com/docs/api-reference/realtime-client-events - https://platform.openai.com/docs/api-reference/realtime-server-events - https://openai.com/brand/ - https://developer.apple.com/documentation/foundation/urlsessionwebsocketd elegate - https://developer.apple.com/documentation/foundation/urlsessionwebsocketta sk - https://github.com/m1guelpf/swift-realtime-openai 参考リンク

Slide 40

Slide 40 text

ご清聴ありがとうございました!