機能

Oracle iOS SDKで構成できる機能は次のとおりです。

絶対タイムスタンプおよび相対タイムスタンプ

  • 機能フラグ: enableTimestamp
  • 機能フラグ: timestampMode

チャット・メッセージについて絶対タイムスタンプまたは相対タイムスタンプを有効にできます。絶対タイムスタンプには、各メッセージの正確な時間が表示されます。相対タイムスタンプは最新のメッセージにのみ表示され、前のメッセージからの秒数、日数、時間数、月数または年数で表されます。絶対タイムスタンプによって得られる正確さはアーカイブ・タスクに最適です。しかしながら、チャット・セッションの限定的なコンテキスト内では、ユーザーがタイムスタンプを比較してメッセージ間の時間経過を求める必要があるため、正確さのためにユーザー・エクスペリエンスが損なわれます。相対タイムスタンプを使用すると、ユーザーは、すぐに理解できる「たった今」「少し前」のような言葉を使用して会話を簡単に進めることができます。相対タイムスタンプを使用すると、開発タスクが簡略化されるだけでなく、別の方法でユーザー・エクスペリエンスが向上します。相対タイムスタンプでは、メッセージからの経過時間が秒、日、時、月または年を単位としてマークされるため、タイムゾーンに合せて変換する必要がありません。

相対タイムスタンプの構成

相対タイムスタンプを追加するには、enableTimestampを有効(true)にし、タイムスタンプのスタイルを制御するtimestampModetimestampMode.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)

サーバーから受信したエージェントの詳細をオーバーライドするには、このAPIを次のように使用します:
ノート

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)

getAgentDetails()

エージェントの詳細を含むオブジェクトを返します。
let agentDetails = BotsUIManager.shared().getAgentDetails()

添付フィルタリング

機能フラグ: shareMenuConfiguration

shareMenuConfigurationを使用して、共有メニュー・ポップアップで使用可能なアイテム・タイプを制限またはフィルタ処理し、アップロードのファイル・サイズ制限をKB単位で設定し(次のスニペットの1024など)、メニューのアイコンおよびラベルをカスタマイズします。デフォルトおよび最大制限は25MBです。
ノート

shareMenuConfigurationを構成する前に、enableAttachmenttrueに設定する必要があります。
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に変換する必要があります。その他の文字列は有効ではありません。typesString(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")])

public func shareMenuItems() -> ([ShareMenuItem], [ShareMenuCustomItem])

次を呼び出して、共有メニュー・アイテム・リストを取得できます
BotsManager.shared().shareMenuItems();
API
BotsManager.shared().shareMenuItems()

フィールドの自動送信

フィールドの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()

disconnectメソッドをコールすると、すべてのネットワーク接続がクローズされます。
BotsManager.shared().disconnect()

パブリックfunc connect()

スキルが切断状態の場合は、Webソケット接続が確立されます。
BotsManager.shared().connect()

パブリック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
    }
}
SDKを初期化するために、次のコード・スニペットに示すように、BotsMessageServiceDelegateプロトコルに準拠するインスタンスをBotsManager.shared().delegateプロパティに割り当てる必要があります:
BotsManager.shared().delegate = self

チャット・セッションの終了

機能フラグ: enableEndConversation

enableEndConversationtrueに設定すると、ヘッダー・ビューにクローズ・ボタンが追加され、ユーザーは現在のチャット・セッションを明示的に終了できます。ユーザーがこのクローズ・ボタンをクリックすると確認プロンプト・ダイアログが開き、クローズ・アクションを確認すると、SDKはチャット・セッションの終了を示すイベント・メッセージをスキルに送信します。次に、SDKはインスタンスからスキルを切断し、チャット・ウィジェットを縮小して、現在のユーザーの会話履歴を消去します。SDKでは、実装可能なBotsEventListenerプロトコルでchatendイベントも呼び出されます。

その後、チャット・ウィジェットを開くと、新しいチャット・セッションが開始されます。

ヒント:

会話を終了するには、BotsManager.shared().endChat()メソッドをコールします。このメソッドは、SDKがヘッドレス・モードで初期化されるときに使用できます。

ヘッドレス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

Webビュー構成を設定するには、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をコールします。

前の入力フォームの置換

エンド・ユーザーがフォームを送信すると、フィールドのautosubmittrueに設定されているため、スキルは新しいEditFormMessagePayloadを送信できます。このメッセージは、前の入力フォーム・メッセージを置き換える必要があります。replaceMessageチャネル拡張プロパティをtrueに設定すると、SDKで以前の入力フォーム・メッセージを現在の入力フォーム・メッセージに置き換えることができます。

「共有」メニュー

デフォルトでは、「共有」メニューには次のファイル・タイプのオプションが表示されます:
  • ビジュアル・メディア・ファイル(イメージおよびビデオ)
  • オーディオ・ファイル
  • ドキュメント、PDF、スプレッドシートなどの一般ファイル
  • ロケーション
sharePopupConfiguration設定を使用すると、「共有」メニューに表示されるアイテムを制限できます。配列のタプルをShareMenuConfigurationに渡す(shareMenuConfiguration = ([ShareMenuItem], [ShareMenuCustomItem]))ことで、メニューで選択できるアイテムのタイプを制限すなわちフィルタしたり、メニューのアイコンやラベルをカスタマイズしたり、アップロード・ファイル・サイズを制限したりできます。タプルには、タイプがShareMenuItemの共有メニュー・オプションの配列とタイプがShareMenuCustomItemの共有メニュー・オプションの配列があります。すべてのファイル・タイプの場合は、いずれかを空の配列として渡します。

public func shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))

メニューの動的な更新を有効にするには:
shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))
このメソッドを使用します。

public func shareMenuItems() -> ([ShareMenuItem], [ShareMenuCustomItem])

このメソッドは、共有メニュー・アイテムの既存の構成を返します。

音声認識

  • 機能フラグ: enableSpeechRecognition
  • 機能構成: enableAutoSendSpeechResponse

enableSpeechRecognition機能フラグをtrueに設定すると、ユーザー入力フィールドが空の場合に送信ボタンのかわりにマイクロフォン・ボタンが表示されます。音声はテキストに変換され、スキルまたはデジタル・アシスタントに送信されます。音声が部分的に認識される場合、マイクロフォン・ボタンをクリックして開くポップアップに部分的な結果が表示されます。

このプロパティをtrueに設定すると、enableAutoSendSpeechResponseプロパティによって有効になる機能もサポートされます。これにより、このプロパティをtrueに設定したときに、ユーザーの音声レスポンスがチャット・サーバーに自動的に送信される一方、レスポンスが送信メッセージとしてチャット・ウィンドウに表示されます。enableSpeechRecognitionAutoSendfalseに設定すると、ユーザーは、発言したメッセージを手動で送信する前に編集(または削除)できるようになります。

音声認識は、次のメソッドを通じて利用されます:

public func startRecording()

ユーザーの音声メッセージの記録を開始します。

public func stopRecording()

ユーザーのメッセージの記録を停止します。

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
SDKは、スキルから新しいメッセージを受信した場合にスキルのメッセージを読み上げる音声合成と統合されています
  • この機能を有効にするには、enableSpeechSynthesis機能フラグをtrueに設定します。
  • speechSynthesisVoicePreferencesプロパティを使用して、スキルのメッセージを読み上げる優先言語を設定できます。このプロパティにより、デバイスが優先言語または優先音声をサポートしていない場合にフォールバックが有効になります。デバイスで優先音声がサポートされない場合は、かわりに優先言語のデフォルト音声が使用されます。優先音声も優先言語もサポートされない場合は、デフォルトの音声と言語が使用されます。

public func speak(text: String)

スキルのレスポンスの読上げを開始します。textパラメータは、読み上げられるスキルのメッセージのテキストです。
BotsManager.shared().speak(text: "What kind of crust do you want?")

public func stopSpeech()

スキルのレスポンスの読上げを停止します。
BotsManager.shared().stopSpeech()

音声サービス注入

機能フラグ: 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に送信します。
    ノート

    この機能は、SDKとOracle B2C Serviceチャット構成の両方で有効にする必要があります。

音声ビジュアライザ

音声サポートが有効になっている場合(botsConfiguration.enableSpeechRecognition = true)、チャット・ウィジェットのフッターに音声ビジュアライザ(音声入力の頻度レベルを示す動的ビジュアライザ・グラフ)が表示されます。ビジュアライザは、ユーザーが話しているのが小さすぎるか大きすぎるかを示して、ユーザーの音声の変調に反応します。このビジュアライザはSwiftのAVAudioEngineを使用して作成され、ヘッドレス・モードで使用するためにSpeechEventListenerプロトコルのonAudioReceivedメソッドで公開されます。

チャット・ウィジェットには、ユーザーが音声アイコンをクリックすると音声ビジュアライザが表示されます。これは、SDKがユーザーの音声をキャプチャするのに、オーディオ・レベルが十分な高さであるかどうかを示すインジケータです。ユーザーのメッセージは、テキストとして認識されるため、ビジュアライザの下に表示されます。
ノート

キーボード・アイコンが表示されると、音声モードが示されます。

botsConfiguration.enableSpeechAutoSendSpeechResponse = trueの場合、ユーザーがメッセージの口述を終了すると、認識されたテキストがスキルに自動的に送信されます。その後、モードはテキスト入力に戻ります。botsConfiguration.enableSpeechAutoSendSpeechResponse = falseの場合も、モードはテキスト入力に戻りますが、この場合、ユーザーはスキルにメッセージを送信する前に認識されたテキストを変更できます。