機能
Oracle iOS SDKで構成できる機能は次のとおりです。
絶対タイムスタンプおよび相対タイムスタンプ
- 機能フラグ:
enableTimestamp
- 機能フラグ:
timestampMode
チャット・メッセージについて絶対タイムスタンプまたは相対タイムスタンプを有効にできます。絶対タイムスタンプには、各メッセージの正確な時間が表示されます。相対タイムスタンプは最新のメッセージにのみ表示され、前のメッセージからの秒数、日数、時間数、月数または年数で表されます。絶対タイムスタンプによって得られる正確さはアーカイブ・タスクに最適です。しかしながら、チャット・セッションの限定的なコンテキスト内では、ユーザーがタイムスタンプを比較してメッセージ間の時間経過を求める必要があるため、正確さのためにユーザー・エクスペリエンスが損なわれます。相対タイムスタンプを使用すると、ユーザーは、すぐに理解できる「たった今」や「少し前」のような言葉を使用して会話を簡単に進めることができます。相対タイムスタンプを使用すると、開発タスクが簡略化されるだけでなく、別の方法でユーザー・エクスペリエンスが向上します。相対タイムスタンプでは、メッセージからの経過時間が秒、日、時、月または年を単位としてマークされるため、タイムゾーンに合せて変換する必要がありません。
相対タイムスタンプの構成
相対タイムスタンプを追加するには、enableTimestamp
を有効(true
)にし、タイムスタンプのスタイルを制御するtimestampMode
をtimestampMode.relative
にする必要があります。timestampMode.relative
を設定すると、一日の最初のメッセージの前にヘッダーとして絶対タイムスタンプが表示されます。このヘッダーは、会話がクリアされておらず、履歴で古いメッセージをまだ確認できる場合に表示されます。
- 最初の10秒間
- 10秒-60秒
- 1分-60分の毎分
- 1時間-24時間の毎時
- 1日-30日の毎日
- 1月-12月の毎月
- 1年目の後の毎年
アクション・レイアウト
BotsProperties.actionsLayout
構成設定を使用して、水平または垂直のレイアウトにアクション・ボタンを表示します。レイアウトは、ローカル処理とグローバル処理、カード処理、フォーム処理に対して設定できます。すべてのアクション・タイプのデフォルト値はhorizontal
です。
BotsProperties.actionsLayout = ActionsLayout(local: .horizontal,global: .vertical,card: .horizontal,form: .horizontal)
エージェント・アバター
ライブ・エージェント・サポートと統合されたスキルの場合、agentAvatar
設定により、エージェントから送信されたメッセージのアバター・アイコンを表示できます。これは、エージェント・メッセージの横に表示されるアイコンのURLを使用して構成します。
アバターとエージェントの詳細を動的に更新する
ユーザーおよびエージェントのアバターを実行時に動的に更新できるようにするには、setUserAvatar(avatarAsset : String)
、getAgentDetails()
およびsetUserAvatar(avatarAsset : String)
を使用します。
ユーザー・アバターの設定
setPersonAvatar(avatarAsset : String)
は、実行時にユーザー・アバターの動的更新を有効にします。このメソッドは、前のメッセージを含むすべてのメッセージのユーザー・アバターを設定します。avatarAsset
には、次のものがあります。
- プロジェクト
Assets
フォルダのアセットの名前。 - 次の例に示すように、イメージ・ソースへの外部リンク。
BotsUIManager.shared().setPersonAvatar(avatarAsset: "https://picsum.photos/200/300")
BotsUIManager.shared().setPersonAvatar(avatarAsset: "userAvatarInAssetsFolder")
エージェントの詳細の設定
setAgentDetails(agentDetails: AgentDetails)
APIを使用して、エージェントの詳細をカスタマイズできます。エージェント名とともに、このAPIを使用してカスタマイズできるその他の属性は、テキストの色とアバターです。エージェント・アバターが構成されていない場合は、エージェント名のイニシャルを使用してアバターを動的に構成できます。これらのイニシャルの色と背景色をカスタマイズすることもできます。getAgentDetails()
APIは、現在のエージェントの詳細を取得します。
これらのAPIはいつでもコールできますが、onReceiveMessage()
イベントまたはbeforeDisplay()
イベントとともに使用することをお薦めします。
setAgentDetails(agentDetails: AgentDetails)
AgentDetails
オブジェクトのすべてのパラメータはオプションです。
// to override avatar , name and name text colorlet agentDetails = AgentDetails(name: "Bob", avatarImage: "https://picsum.photos/200/300", nameTextColor: .red)
// to override avatar , namelet agentDetails = AgentDetails(name: "Bob", avatarImage: "https://picsum.photos/200/300")
// to override avatar, name, name text color,avatar initials color , avatar background let agentDetails = AgentDetails(name: "Bob", nameTextColor: .red,avatarTextColor: .blue,avatarBackgroundColor: .green)
BotsUIManager.shared().setAgentDetails(agentDetails: agentDetails)
AgentDetails
オブジェクトの各プロパティは変更できます。例:let agentDetails = AgentDetails()
agentDetails.name = "Bob"
agentDetails.avatarImage = "agentAvatar"
agentDetails.nameTextColor = .red
agentDetails.avatarBackgroundColor = .green
agentDetails.avatarTextColor = .brown
BotsUIManager.shared().setAgentDetails(agentDetails: agentDetails)
添付フィルタリング
機能フラグ: shareMenuConfiguration
shareMenuConfiguration
を使用して、共有メニュー・ポップアップで使用可能なアイテム・タイプを制限またはフィルタ処理し、アップロードのファイル・サイズ制限をKB単位で設定し(次のスニペットの1024など)、メニューのアイコンおよびラベルをカスタマイズします。デフォルトおよび最大制限は25MBです。
shareMenuConfiguration
を構成する前に、enableAttachment
をtrue
に設定する必要があります。
botsConfiguration.shareMenuConfiguration = ([ShareMenuItem.files, ShareMenuItem.camera, ShareMenuItem.location], [ShareMenuCustomItem(types: [String(kUTTypePDF)], label: "PDF Files", maxSize: 1024), ShareMenuCustomItem(types: [String(kUTTypeText)], label: "Text Files")])
types
では、対応するファイル・タイプにCFStringを使用し、String
に変換する必要があります。その他の文字列は有効ではありません。types
をString(kUTTypeItem)
と設定すると、ユーザーがすべてのファイル・タイプをアップロードできるようになります。
public func shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))
BotsManager.shared().shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))
APIをコールして、共有メニュー項目のポップアップを動的に更新できます。BotsManager.shared().shareMenuItems([ShareMenuItem.files, ShareMenuItem.camera, ShareMenuItem.location], [ShareMenuCustomItem(types: [String(kUTTypePDF)], label: "PDF Files", maxSize: 1024), ShareMenuCustomItem(types: [String(kUTTypeText)], label: "Text Files")])
フィールドの自動送信
フィールドのautoSubmit
プロパティがtrue
に設定されている場合、クライアントは、これまでに入力された有効なフィールド値を含むsubmittedField
マップを含むFormSubmissionMessagePayload
を送信します。まだ設定されていないフィールド(必須かどうかに関係なく)、またはクライアント側の検証に違反するフィールドは、submittedField
マップに含まれません。自動送信フィールド自体に無効な値が含まれている場合、送信メッセージは送信されず、その特定のフィールドに対するクライアント・エラー・メッセージが表示されます。自動発行が成功すると、フォーム送信メッセージのpartialSubmitField
は、autoSubmit
フィールドのid
に設定されます。
接続、切断および破棄メソッド
スキルの接続または切断、またはpublic func destroy()
、public func disconnect()
およびpublic func connect()
メソッドを使用してSDKを破棄できます。
パブリックfunc destroy()
アクティブな接続、音声認識、音声合成、ファイルのアップロードを閉じ、SDKビュー・コントローラを削除することで、SDKを破棄します。いったん呼び出されると、どのパブリックAPIメソッドも呼び出せません。initialize(botsConfiguration: BotsConfiguration, completionHandler: @escaping (ConnectionStatus, Error?) -> ())
メソッドが再度コールされてSDKを初期化した後にのみ、再度アクティブになります。
パブリックfunc disconnect()
BotsManager.shared().disconnect()
パブリックfunc接続(botsConfiguration: BotsConfiguration)
BotsConfiguration
でコールすると、既存のWebソケット接続がクローズされ、新しいチャネル・プロパティを使用して新しい接続が確立されます。BotsConfiguration
に設定されたその他のプロパティは、そのまま残ります。var botsConfiguration = BotsConfiguration(url: url, userId: userId, channelId: channelId)
BotsManager.shared().connect(botsConfiguration: botsConfiguration)
デフォルトのクライアント・レスポンス
機能フラグ: enableDefaultClientResponse
enableDefaultClientResponse: true
を使用して、スキル・レスポンスが遅延したとき、またはスキル・レスポンスがまったくない場合、入力インジケータを伴うデフォルトのクライアント側レスポンスを指定します。ユーザーが最初のメッセージ/問合せを送信したが、スキルがdefaultGreetingTimeout
で設定された秒数で応答しない場合、スキルはodais_default_greeting_message
翻訳文字列を使用して構成されたグリーティング・メッセージを表示できます。次に、クライアントはスキルのレスポンスを再度チェックします。スキルのレスポンスを受信した場合、クライアントはスキルのレスポンスを表示しますが、受信されていない場合は、defaultWaitMessageInterval
フラグで設定された間隔で待機メッセージ(odais_default_wait_message
変換文字列で構成)を表示します。スキル・レスポンスの待機がtypingStatusTimeout
フラグで設定されたしきい値を超えると、クライアントはユーザーへのsorryレスポンスを表示し、入力インジケータを停止します。odais_default_sorry_message
変換文字列を使用して、sorryレスポンスを構成できます。
委任
BotsMessageServiceDelegate
プロトコルに準拠し、次のメソッドを実装している必要があります:
public func beforeDisplay(message: [String: Any]?) -> [String: Any]?
このメソッドでは、スキルのメッセージ・ペイロードが会話で表示される前に変更できるようになります。メソッドから返されたメッセージ・ペイロードは、メッセージの表示に使用されます。nil
が返された場合、メッセージは表示されません。
public func beforeSend(message: [String: Any]?) -> [String: Any]?
このメソッドでは、ユーザー・メッセージ・ペイロードがチャット・サーバーに送信される前に変更できるようになります。メソッドから返されたメッセージ・ペイロードは、スキルに送信されます。nil
が返された場合、メッセージは送信されません。
public func beforeSendPostback(action: [String: Any]?) -> [String: Any]?
public func beforeSendPostback(action: [String: Any]?) -> [String: Any]?
では、ポストバック・アクション・ペイロードがチャット・サーバーに送信される前に変更できるようになります。メソッドから返されたアクション・ペイロードは、スキルに送信されます。nil
が返された場合、ユーザーが選択したポストバック・アクションはチャット・サーバーに送信されません。public class ViewController: UIViewController, BotsMessageServiceDelegate {
func beforeSend(message: [String : Any]?) -> [String : Any]? {
// Handle before send delegate here
}
func beforeDisplay(message: [String : Any]?) -> [String : Any]? {
// Handle before display delegate here
}
func beforeSendPostback(action: [String : Any]?) -> [String : Any]? {
// Handle before send postback action delegate here
}
}
BotsMessageServiceDelegate
プロトコルに準拠するインスタンスをBotsManager.shared().delegate
プロパティに割り当てる必要があります:BotsManager.shared().delegate = self
チャット・セッションの終了
機能フラグ: enableEndConversation
enableEndConversation
をtrue
に設定すると、ヘッダー・ビューにクローズ・ボタンが追加され、ユーザーは現在のチャット・セッションを明示的に終了できます。ユーザーがこのクローズ・ボタンをクリックすると確認プロンプト・ダイアログが開き、クローズ・アクションを確認すると、SDKはチャット・セッションの終了を示すイベント・メッセージをスキルに送信します。次に、SDKはインスタンスからスキルを切断し、チャット・ウィジェットを縮小して、現在のユーザーの会話履歴を消去します。SDKでは、実装可能なBotsEventListener
プロトコルでchatend
イベントも呼び出されます。
ヘッドレスSDK
SDKは、そのUIがなくても使用できます。SDKは、サーバーへの接続を維持し、メッセージの送信、メッセージの受信、およびネットワーク・ステータスやその他のサービスに関する更新の取得を行うAPIを提供します。APIを使用してSDKと対話し、UIを更新できます。
BotsManager
クラスで使用可能なsend*()
APIのいずれかを使用してメッセージを送信できます。たとえば、public func send(message: UserMessage)
はスキルまたはデジタル・アシスタントにテキスト・メッセージを送信します。
public func send(message: UserMessage)
この関数は、メッセージをスキルに送信します。message
パラメータは、UserMessage
クラスに準拠するクラスのインスタンスです。この場合は、UserTextMessage
.BotsManager.shared().send(message: UserTextMessage(text: "I want to order a pizza", type: .text))
です
BotsEventListener
BotsEventListener
プロトコルを実装でき、このプロトコルは次のメソッドを実装します:
onStatusChange(ConnectionStatus connectionStatus)
– このメソッドは、WebSocket接続のステータスが変更されたときにコールされます。connectionStatus
パラメータは、接続の現在のステータスです。ConnectionStatus
列挙の詳細は、SDKに含まれるAPIドキュメントを参照してください。onReceiveMessage(message: BotsMessage)
– このメソッドは、新しいメッセージがスキルから受信されたときにコールされます。message
パラメータは、スキルから受信されたメッセージです。BotsMessage
クラスの詳細は、SDKに含まれるAPIドキュメントを参照してください。onUploadAttachment(message: BotsAttachmentMessage)
– このメソッドは、アタッチメントのアップロードが完了したときにコールされます。message
パラメータは、アップロードされたアタッチメントのBotsAttachmentMessage
オブジェクトです。onDestroy()
– このメソッドは、destroy()
メソッドが呼び出されたときに呼び出されます。onInitialize()
– このメソッドは、initialize(botsConfiguration: BotsConfiguration, completionHandler: @escaping (ConnectionStatus, Error?) -> ())
メソッドがコールされたときにコールされます。次のパラメータを取ります。newLanguage
– 新しく設定されたチャット言語のSupportedLanguage
オブジェクト。
beforeEndConversation()
– このメソッドは、終了会話セッションが開始されたときにコールされます。chatEnd()
– 会話が正常に終了した後にトリガーされるコールバック・メソッド。
extension ViewController: BotsEventListener {
func onReceiveMessage(message: BotsMessage) {
// Handle the messages received from skill or Digital Assistant
}
func onUploadAttachment(message: BotsAttachmentMessage) {
// Handle the post attachment upload actions
}
func onStatusChange(connectionStatus: ConnectionStatus) {
// Handle the connection status change
}
func onInitialize() {
//Handle initialization
}
func onDestroy() {
//Handle destroy
}
func onChatLanguageChange(newLanguage: SupportedLanguage) {
//Handle the language change.
}
func beforeEndConversation(completionHandler: @escaping (EndConversationStatus) -> Void) {
//Do the desired cleanup before session is closed.
return completionHandler(.success) // if cleanup was successfull.
return completionHandler(.success) // if there was en error cleaning up.
}
func chatEnd() {
//Handle successfull session end from server before the SDK is destroyed.
}
}
SDKを初期化するために、次のコード・スニペットに示すように、BotsEventListener
プロトコルに準拠するインスタンスをBotsManager.shared().botsEventListener
プロパティに割り当てる必要があります:BotsManager.shared().botsEventListener = self
ウィジェット内Webビュー
UIプロパティ: LinkHandler
ユーザーがチャット・ウィジェット内からWebページにアクセスできるように、チャット・メッセージのリンク動作を構成できます。チャット・ウィジェットがWebビュー内でリンクを開くため、ユーザーは、ページをタブまたは別のブラウザ・ウィンドウで表示するために会話から切り替える必要がなく、チャットにとどまることができます。
ウィジェット内Webビューの構成
UIプロパティ: WebViewConfig
LinkHandler
プロパティにLinkHandlerType.webview
を設定します。WebViewConfig
は、WebViewConfiguration
構造体インスタンスに設定できます。
BotsProperties.LinkHandler = LinkHandlerType.webview
//Set the properties which you want changed from the default values.
BotsProperties.WebViewConfig.webViewSize = WebViewSize.full
BotsProperties.WebViewConfig.clearButtonLabelColor = UIColor.black
このコード・スニペットに示すように、Webビューに次の属性を設定できます:属性 | 設定 |
---|---|
webViewSize |
ウィジェット内Webビュー・ウィンドウの画面サイズをWebviewSize 属性を使用して設定します。これには、parial (WebviewSize.partial )とfull (WebviewSizeWindow.full )という2つの値があります。
|
clearButtonLabel |
Webビューの右上隅にあるクリア/クローズ・ボタンに使用するテキストを設定します。デフォルトのテキストは、Localizable.strings ファイルでodais_done に設定されている文字列から取得されます。
|
clearButtonIcon |
クリア・ボタンのアイコンを設定します。このアイコンは、ボタン内に左揃えで表示されます。デフォルトでは、クリア・ボタンにアイコンは設定されていません。空の文字列です。 |
clearButtonLabelColor |
クリア・ボタン・ラベルのテキストの色を設定します。デフォルトの色はUIColor.white です。
|
clearButtonColor |
クリア・ボタンの背景色を設定します。デフォルトの色はUIColor.clear です。
|
webviewHeaderColor |
Webビュー・ヘッダーの背景色を設定します。 |
webviewTitleColor |
ヘッダーのタイトルの色を設定します。タイトルは、開いているWebリンクのURLです。 |
メッセージのタイムスタンプのフォーマット
timestampFormat
フラグは、メッセージに表示されるタイムスタンプをフォーマットします。"hh:mm:ss"
などのフォーマット・トークンおよびSwift DateFormatterでサポートされているその他のフォーマットで構成される文字列を受け入れることができます。
複数言語チャット
機能フラグ: multiLangChat
iOS SDKのネイティブ言語により、チャット・ウィジェットはユーザーの言語を検出したり、ユーザーが会話言語を選択できるようにすることができます。ユーザーは、会話間でのみ言語を切り替えることができますが、新しい言語を選択すると会話がリセットされるため、会話中にはできません。
言語メニューの有効化
multiLangChat
プロパティを、言語タグ(lang
)とオプションの表示ラベル(label
)で構成されるsupportedLanguages
配列を含むオブジェクトで定義することで、ユーザーがドロップダウン・メニューから優先言語を選択できるメニューを有効にできます。この配列の外側では、オプションでprimaryLanguage
変数(次のスニペットではMultiLangChat(primaryLanguage: String)
)を使用してデフォルト言語を設定できます。 botsConfiguration.multiLangChat = MultiLangChat(
supportedLanguages:[
SupportedLanguage.init(lang: "en", label: "English"),
SupportedLanguage.init(lang: "fr"),
SupportedLanguage.init(lang: "fr-CA", label: "French (Canada)")
],
primaryLanguage: "fr-CA"
)
言語およびリージョン・コードをローカライズ可能な.lproj (ローカライゼーション・プロジェクト)ファイルで適切に書式設定するには、アンダースコア(
_
)ではなく、区切り文字としてダッシュ(-
)を使用します。たとえば、fr_CA
ではなくfr-CA
を使用します。これは、アプリケーションでの.lproj
ファイルの作成方法と一致します。SDKは、.lproj
ファイルを検索するときに、最初に正確なlanguageCode-Region.lproj
形式のファイルを検索しようとします。このようなファイルが見つからない場合、SDKはlanguageCode.lproj
ファイルを検索します。これも見つからない場合、SDKはbase.lproj
ファイルを検索します。これらのいずれも見つからない場合、SDKはデフォルトで英語(en
)を使用します。
渡されたサポート対象言語が、チャット・ウィジェットによって、ヘッダーにあるドロップダウン・メニューに表示されます。使用可能な言語に加えて、メニューには「言語の検出」オプションも含まれています。ユーザーがこのメニューから言語を選択すると、現在の会話がリセットされ、選択した言語で新しい会話が開始されます。ユーザーが選択した言語は、同じブラウザではセッションにまたがって継続されるため、チャット・ウィジェットを含むページからユーザーがスキルに再アクセスすると、以前の言語が自動的に選択されます。
onChatLanguageChange
イベントのイベント・リスナーを追加できます。これは、チャット言語がドロップダウン・メニューから選択されているか、変更されたときにトリガーされます。
- ドロップダウン・メニューを表示するには、少なくとも2つの言語を定義する必要があります。
primaryLanguage
属性を省略すると、ウィジェットがユーザー・プロファイルの言語を自動的に検出し、メニューの「言語の検出」オプションを選択します。label
キーは、ネイティブ・サポート言語ではオプションです。fr
はメニューでは「フランス語」と表示され、es
は「スペイン語」と表示されます。label
はオプションですが、追加した言語がネイティブにサポートされない場合、タグを識別するラベルを追加する必要があります。たとえば、label: 'हिंदी'
をlang: "hi"
に対して定義しないと、ドロップダウン・メニューに「hi」がかわりに表示され、最適なユーザー・エクスペリエンスを提供できなくなります。
言語メニュー使用不可
バージョン21.12以降では、MultiLangChat(primaryLanguage: String)
を渡すことで言語選択ドロップダウン・メニューを構成する必要なく、チャット言語を構成および更新することもできます。
言語の検出
渡された言語の他に、チャット・ウィジェットでは、ドロップダウン・メニューに「言語の検出」オプションが表示されます。このオプションを選択すると、ユーザーのメッセージから会話の言語を自動的に検出し、可能な場合は同じ言語で応答することがスキルに指示されます。
BotsManager.shared().setPrimaryLanguage(primaryLanguage: String)
APIをコールすると、選択した言語を動的に更新できます。渡されたlang
がサポートされている言語のいずれかと一致すると、その言語が選択されます。一致するものが見つかりません。「言語の検出」がアクティブ化されます。BotsManager.shared().setPrimaryLanguage(primaryLanguage: "und")
APIをコールして、「言語の検出」オプションをアクティブ化することもできます("und"
は未確定、またはprimaryLanguage:nil
を渡すことによって示されます)。
ドロップダウン・メニューが構成されていない場合でも、setPrimaryLanguage(primaryLanguage: String)
APIを使用してチャット言語を動的に更新できます。
複数言語チャット・クイック・リファレンス
手順は次のとおりです... | ...操作 |
---|---|
エンド・ユーザーに言語選択ドロップダウン・メニューを表示します。 | MultiLangChat(supportedLanguages: [SupportedLanguage]) を渡します。
|
言語選択ドロップダウン・メニューをエンド・ユーザーに表示せずに、チャット言語を設定します。 | MultiLangChat(primaryLanguage: String) を渡します。
|
デフォルト言語を設定します。 | MultiLangChat(supportedLanguages: [SupportedLanguage], primaryLanguage: String) を渡します。
|
言語検出機能の有効化 | primaryLanguage:nil またはprimaryLanguage:"und" を渡します。
|
チャット言語を動的に更新します。 | setPrimaryLanguage(primaryLanguage: String) APIをコールします。
|
前の入力フォームの置換
エンド・ユーザーがフォームを送信すると、フィールドのautosubmit
がtrue
に設定されているため、スキルは新しいEditFormMessagePayload
を送信できます。このメッセージは、前の入力フォーム・メッセージを置き換える必要があります。replaceMessage
チャネル拡張プロパティをtrue
に設定すると、SDKで以前の入力フォーム・メッセージを現在の入力フォーム・メッセージに置き換えることができます。
「共有」メニュー
- ビジュアル・メディア・ファイル(イメージおよびビデオ)
- オーディオ・ファイル
- ドキュメント、PDF、スプレッドシートなどの一般ファイル
- ロケーション
sharePopupConfiguration
設定を使用すると、「共有」メニューに表示されるアイテムを制限できます。配列のタプルをShareMenuConfiguration
に渡す(shareMenuConfiguration = ([ShareMenuItem], [ShareMenuCustomItem])
)ことで、メニューで選択できるアイテムのタイプを制限すなわちフィルタしたり、メニューのアイコンやラベルをカスタマイズしたり、アップロード・ファイル・サイズを制限したりできます。タプルには、タイプがShareMenuItem
の共有メニュー・オプションの配列とタイプがShareMenuCustomItem
の共有メニュー・オプションの配列があります。すべてのファイル・タイプの場合は、いずれかを空の配列として渡します。
音声認識
- 機能フラグ:
enableSpeechRecognition
- 機能構成:
enableAutoSendSpeechResponse
enableSpeechRecognition
機能フラグをtrue
に設定すると、ユーザー入力フィールドが空の場合に送信ボタンのかわりにマイクロフォン・ボタンが表示されます。音声はテキストに変換され、スキルまたはデジタル・アシスタントに送信されます。音声が部分的に認識される場合、マイクロフォン・ボタンをクリックして開くポップアップに部分的な結果が表示されます。
このプロパティをtrue
に設定すると、enableAutoSendSpeechResponse
プロパティによって有効になる機能もサポートされます。これにより、このプロパティをtrue
に設定したときに、ユーザーの音声レスポンスがチャット・サーバーに自動的に送信される一方、レスポンスが送信メッセージとしてチャット・ウィンドウに表示されます。enableSpeechRecognitionAutoSend
をfalse
に設定すると、ユーザーは、発言したメッセージを手動で送信する前に編集(または削除)できるようになります。
public func isRecording() -> Bool
音声記録が開始されているかどうかを確認します。記録が開始されている場合はtrue
を返します。そうでない場合はfalse
を返します。
BotsEventListener
プロトコルのonSpeechResponseReceived(data: String, final: Bool)
関数を使用すると、音声サーバーからのすべてのレスポンスを処理できます。BotsManager.shared().startRecording()
if (BotsManager.shared().isRecording()) {
BotsManager.shared().stopRecording() // Stop voice recording
}
音声合成
- 機能フラグ:
enableSpeechSynthesis
- 機能構成:
speechSynthesisVoicePreferences
- この機能を有効にするには、
enableSpeechSynthesis
機能フラグをtrue
に設定します。 speechSynthesisVoicePreferences
プロパティを使用して、スキルのメッセージを読み上げる優先言語を設定できます。このプロパティにより、デバイスが優先言語または優先音声をサポートしていない場合にフォールバックが有効になります。デバイスで優先音声がサポートされない場合は、かわりに優先言語のデフォルト音声が使用されます。優先音声も優先言語もサポートされない場合は、デフォルトの音声と言語が使用されます。
音声サービス注入
機能フラグ: ttsService
ttsService
機能フラグを使用すると、任意のテキスト読み上げ(TTS)サービス(独自のサービス、またはサードパーティ・ベンダーが提供するサービス)をSDKに注入できます。TTSサービスを注入するには、最初にenableSpeechSynthesis
機能フラグをtrue
に設定してから、TTSService
インタフェースのインスタンスをttsService
フラグに渡す必要があります。
TTSServiceプロトコル
TTSService
インタフェースの実装であるクラスのインスタンスを作成します。次のメソッドが実装されています。
speak(text: String)
- このメソッドは、発話キューに読み込まれるテキストを追加します。text
パラメータは、使用するテキストです。isSpeaking()
- このメソッドは、オーディオ・レスポンスが話されているかどうかをチェックします。オーディオ・レスポンスが話されていない場合は、false
を返します。stopSpeech()
- このメソッドは、進行中の音声合成を停止します。
class CustomTTSService: TTSService {
func speak(text: String) {
// Adds text to the utterance queue to be spoken
}
func stopSpeech() {
// Stops any ongoing speech synthesis
}
func isSpeaking() -> Bool {
// Checks whether the bot audio response is being spoken or not.
}
}
ユーザーエージェント会話のインジケータの入力
機能フラグ: enableSendTypingStatus
このフラグを有効にすると、SDKは、ユーザーが現在入力しているテキストとともにRESPONDING
入力イベントをOracle B2C ServiceまたはOracle Fusion Serviceに送信します。これは、エージェント・コンソールの入力インジケータを示しています。ユーザーが入力を完了すると、SDKによってLISTENING
イベントがサービスに送信されます。これにより、エージェント・コンソールの入力インジケータが非表示になります。
同様に、エージェントが入力中の場合、SDKはサービスからRESPONDING
イベントを受信します。このイベントを受信すると、SDKはユーザーに入力インジケータを表示します。エージェントがアイドル状態になると、SDKはサービスからLISTENING
イベントを受信します。このイベントを受信すると、SDKによって、ユーザーに表示される入力インジケータが非表示になります。
sendUserTypingStatus
APIは、ヘッドレス・モードでも同じ動作を有効にします。 public func sendUserTypingStatus(status: TypingStatus, text: String? = nil)
- エージェント・コンソールに入力インジケータを表示するには:
BotsManager.shared().sendUserTypingStatus(status: .RESPONDING, text: textToSend)
- エージェント・コンソールで入力インジケータを非表示にするには:
BotsManager.shared().sendUserTypingStatus(status: .LISTENING)
- ユーザー側の入力インジケータを制御するには、
onReceiveMessage()
イベントを使用します。例:public func onReceiveMessage(message: BotsMessage) { if message is AgentStatusMessage { if let status = message.payload["status"] as? String { switch status { case TypingStatus.LISTENING.rawValue: hideTypingIndicator() case TypingStatus.RESPONDING.rawValue: showTypingIndicator() } } } }
BotsConfiguration
には、追加の制御を提供する2つの設定があります。
typingStatusInterval
– デフォルトでは、SDKは3秒ごとにRESPONDING
入力イベントをOracle B2C Serviceに送信します。このフラグを使用して、このイベントを抑制します。設定できる最小値は3秒です。enableAgentSneakPreview
- Oracle B2C Serviceでは、入力中のユーザー・テキストの表示がサポートされています。このフラグがtrue
(デフォルトはfalse
)に設定されている場合、SDKは実際のテキストを送信します。ユーザー・プライバシを保護するために、フラグがfalse
に設定されている場合、SDKはテキストのかわりに...
をOracle B2C Serviceに送信します。
音声ビジュアライザ
音声サポートが有効になっている場合(botsConfiguration.enableSpeechRecognition = true
)、チャット・ウィジェットのフッターに音声ビジュアライザ(音声入力の頻度レベルを示す動的ビジュアライザ・グラフ)が表示されます。ビジュアライザは、ユーザーが話しているのが小さすぎるか大きすぎるかを示して、ユーザーの音声の変調に反応します。このビジュアライザはSwiftのAVAudioEngineを使用して作成され、ヘッドレス・モードで使用するためにSpeechEventListener
プロトコルのonAudioReceived
メソッドで公開されます。
キーボード・アイコンが表示されると、音声モードが示されます。
botsConfiguration.enableSpeechAutoSendSpeechResponse = true
の場合、ユーザーがメッセージの口述を終了すると、認識されたテキストがスキルに自動的に送信されます。その後、モードはテキスト入力に戻ります。botsConfiguration.enableSpeechAutoSendSpeechResponse = false
の場合も、モードはテキスト入力に戻りますが、この場合、ユーザーはスキルにメッセージを送信する前に認識されたテキストを変更できます。