Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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
ご清聴ありがとうございました!