Recursos
Aqui estão os recursos que você pode configurar no Oracle iOS SDK.
Timestamps Absolutos e Relativos
- Flag do recurso:
enableTimestamp
- Flag do recurso:
timestampMode
Você pode ativar timestamps absolutos ou relativos para mensagens de chat. Os timestamps absolutos exibem a hora exata de cada mensagem. Os timestamps relativos só são exibidos na mensagem mais recente e expressam o tempo em termos de segundos, dias, horas, meses ou anos atrás em relação à mensagem anterior. A precisão fornecida por timestamps absolutos os torna ideais para tarefas de arquivamento, mas dentro do contexto limitado de uma sessão de chat, essa precisão é extraída da experiência do usuário porque os usuários devem comparar os timestamps para descobrir a passagem de tempo entre as mensagens. Os timestamps relativos permitem que os usuários rastreiem a conversa facilmente por meio de termos como Há Pouco e Há alguns momentos que podem ser imediatamente compreendidos. Os timestamps relativos melhoram a experiência do usuário de outra forma, além de também simplificar suas tarefas de desenvolvimento: como os timestamps relativos marcam as mensagens em termos de segundos, dias, horas, meses ou anos atrás, você não precisa convertê-las em fusos horários.
Configurar Timestamps Relativos
Para adicionar um timestamp relativo, enableTimestamp
deve ser ativado (true
) e timestampMode
, que controla o estilo de timestamp, deve ser timestampMode.relative
. Ao definir timestampMode.relative
, um timestamp absoluto é exibido antes da primeira mensagem do dia como cabeçalho. Esse cabeçalho é exibido quando a conversa não foi limpa e mensagens mais antigas ainda estão disponíveis no histórico.
- Nos primeiros 10s
- Entre 10s e 60s
- Cada minuto entre 1m e 60m
- Cada hora entre 1hr e 24hr
- Cada dia entre 1d e 30d
- Cada mês entre 1m e 12m
- Todo ano após o primeiro ano
Layout de Ações
Use as definições de configuração BotsProperties.actionsLayout
para exibir os botões de ação em layouts horizontais ou verticais. O layout pode ser definido para ações locais, ações globais, ações de cartão e ações de formulário. O valor padrão é horizontal
para todos os tipos de ação.
BotsProperties.actionsLayout = ActionsLayout(local: .horizontal,global: .vertical,card: .horizontal,form: .horizontal)
Avatars do Agente
Para habilidades integradas ao suporte ao agente ao vivo, a definição agentAvatar
permite a exibição de um ícone de avatar para as mensagens enviadas pelos agentes. é possível configura isso com o URL do ícone que é exibido ao lado das mensagens do agente.
Atualizar Dinamicamente Avatares e Detalhes do Agente
Você pode ativar os avatares do usuário e do agente para serem atualizados dinamicamente no runtime usando setUserAvatar(avatarAsset : String)
, getAgentDetails()
e setUserAvatar(avatarAsset : String)
.
Definir o Avatar do Usuário
setPersonAvatar(avatarAsset : String)
permite a atualização dinâmica do avatar do usuário no runtime. Este método define o avatar do usuário para todas as mensagens, incluindo mensagens anteriores. O avatarAsset
pode ser:
- O nome do ativo da pasta
Assets
do projeto. - Um link externo para a origem da imagem, conforme mostrado no exemplo a seguir.
BotsUIManager.shared().setPersonAvatar(avatarAsset: "https://picsum.photos/200/300")
BotsUIManager.shared().setPersonAvatar(avatarAsset: "userAvatarInAssetsFolder")
Definir os Detalhes do Agente
Você pode personalizar os detalhes do agente usando a API setAgentDetails(agentDetails: AgentDetails)
. Juntamente com o nome do agente, os outros atributos que você pode usar essa API para personalizar são a cor do texto e o avatar. Se nenhum avatar do agente tiver sido configurado, o avatar poderá ser configurado dinamicamente com as iniciais do nome do agente. Você também pode personalizar a cor dessas iniciais e cores de fundo. A API getAgentDetails()
recupera os detalhes atuais do agente.
Embora essas APIs possam ser chamadas a qualquer momento, recomendamos usá-las com os eventos onReceiveMessage()
ou beforeDisplay()
.
setAgentDetails(agentDetails: AgentDetails)
Todos os parâmetros do objeto
AgentDetails
são opcionais.
// 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
pode ser modificada. Por exemplo :let agentDetails = AgentDetails()
agentDetails.name = "Bob"
agentDetails.avatarImage = "agentAvatar"
agentDetails.nameTextColor = .red
agentDetails.avatarBackgroundColor = .green
agentDetails.avatarTextColor = .brown
BotsUIManager.shared().setAgentDetails(agentDetails: agentDetails)
Filtragem de Anexo
Flag do recurso: shareMenuConfiguration
shareMenuConfiguration
para restringir ou filtrar os tipos de item disponíveis no pop-up do menu de compartilhamento, definir o limite de tamanho do arquivo em KB para uploads (como 1024 no trecho de código a seguir) e personalizar os ícones e rótulos do menu. O limite padrão e máximo é 25 MB.
Para poder configurar
shareMenuConfiguration
, defina enableAttachment
como 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")])
Para o types
, você precisa usar o CFString para o tipo de arquivo correspondente e convertê-lo em String
. Qualquer outra string não será válida. Você pode permitir que os usuários façam upload de todos os tipos de arquivo, definindo types
como String(kUTTypeItem)
.
public func shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))
BotsManager.shared().shareMenuItems(shareMenuItems: ([ShareMenuItem], [ShareMenuCustomItem]))
.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")])
Envio automático de um campo
Quando um campo tem a propriedade autoSubmit
definida como true
, o cliente envia um FormSubmissionMessagePayload
com o mapa submittedField
contendo os valores de campo válidos que foram informados até o momento. Todos os campos que ainda não foram definidos (independentemente de serem obrigatórios) ou campos que violam uma validação do cliente não são incluídos no mapa submittedField
. Se o próprio campo enviado automaticamente contiver um valor que não seja válido, a mensagem de envio não será enviada e a mensagem de erro do cliente será exibida para esse campo específico. Quando um envio automático for bem-sucedido, o partialSubmitField
na mensagem de envio do formulário será definido como id
do campo autoSubmit
.
Conectar, Desconectar e Destruir Métodos
A habilidade pode ser conectada ou desconectada, ou o SDK pode ser destruído, usando os métodos public func destroy()
, public func disconnect()
e public func connect()
.
func público destroy()
Destrói o SDK fechando qualquer conexão ativa, reconhecimento de voz, síntese de fala, uploads de arquivos e removendo o controlador de exibição do SDK. Uma vez chamados, nenhum dos métodos de API pública pode ser chamado. Eles só estarão ativos novamente depois que o método initialize(botsConfiguration: BotsConfiguration, completionHandler: @escaping (ConnectionStatus, Error?) -> ())
for chamado novamente para inicializar o SDK.
func público disconnect()
BotsManager.shared().disconnect()
função pública connect()
BotsManager.shared().connect()
public func connect(botsConfiguration: BotsConfiguration)
BotsConfiguration
, a conexão de soquete Web existente é fechada e uma nova conexão é estabelecida usando as novas propriedades de canal. Outras propriedades definidas em BotsConfiguration
permanecem como estão.var botsConfiguration = BotsConfiguration(url: url, userId: userId, channelId: channelId)
BotsManager.shared().connect(botsConfiguration: botsConfiguration)
Respostas Padrão do Cliente
Flag do recurso: enableDefaultClientResponse
Use enableDefaultClientResponse: true
para fornecer respostas padrão do cliente acompanhadas por um indicador de digitação quando a resposta da habilidade tiver sido atrasada ou quando não houver resposta da habilidade. Se o usuário enviar a primeira mensagem/consulta, mas a habilidade não responder com o número de segundos definido por defaultGreetingTimeout
, a habilidade poderá exibir uma mensagem de saudação configurada usando a string de tradução odais_default_greeting_message
. Em seguida, o cliente verifica novamente a resposta da habilidade. O cliente exibirá a resposta da habilidade se ela tiver sido recebida, mas se não tiver sido recebida, o cliente exibirá uma mensagem de espera (configurada com a string de tradução odais_default_wait_message
) em intervalos definidos pelo flag defaultWaitMessageInterval
. Quando a espera pela resposta da habilidade excede o limite definido pelo flag typingStatusTimeout
, o cliente exibe uma resposta lamentável ao usuário e interrompe o indicador de digitação. Você pode configurar a resposta de desculpas usando a string de tradução odais_default_sorry_message
.
Delegação
BotsMessageServiceDelegate
e implementar os seguintes métodos:
public func beforeDisplay(message: [String: Any]?) -> [String: Any]?
Este método permite que o payload de mensagem de uma habilidade seja modificado antes de ser exibido na conversa. O payload de mensagem retornado pelo método é usado para exibir a mensagem. Se ele retornar nil
, a mensagem não será exibida.
public func beforeSend(message: [String: Any]?) -> [String: Any]?
Este método permite que um payload de mensagem do usuário seja modificado antes de ser enviado ao servidor de chat. O payload da mensagem retornado pelo método é enviado para a habilidade. Se ele retornar nil
, a mensagem não será enviada.
public func beforeSendPostback(action: [String: Any]?) -> [String: Any]?
public func beforeSendPostback(action: [String: Any]?) -> [String: Any]?
permite que um payload de ação de postback seja modificado antes de ser enviado ao servidor de chat. O payload de ação retornado pelo método é enviado para a habilidade. Se ele retornar nil
, a ação de postback selecionada pelo usuário não será enviada ao servidor de chat.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
, deve ser designada à propriedade BotsManager.shared().delegate
, conforme mostrado no trecho de código a seguir para inicializar o SDK:BotsManager.shared().delegate = self
Encerrar a Sessão de Chat
Flag do recurso: enableEndConversation
enableEndConversation
, quando definido como true
, adiciona um botão de fechamento à view de cabeçalho que permite aos usuários encerrar explicitamente a sessão de chat atual. Uma caixa de diálogo de prompt de confirmação é aberta quando os usuários clicam nesse botão de fechamento e, quando confirmam a ação de fechamento, o SDK envia uma mensagem de evento para a habilidade que marca o fim da sessão de chat. O SDK, em seguida, desconecta a habilidade da instância, recolhe o widget de chat e apaga o histórico de conversas do usuário atual. O SDK também gera um evento chatend
no protocolo BotsEventListener
que você pode implementar.
Dica:
A conversa também pode ser encerrada chamando o métodoBotsManager.shared().endChat()
, que você pode usar quando o SDK é inicializado no modo sem interface do usuário.
SDK sem Interface do Usuário
O SDK pode ser usado sem sua interface de usuário. O SDK mantém a conexão com o servidor e fornece APIs para enviar mensagens, receber mensagens e obter atualizações para o status da rede e para outros serviços. Você pode usar as APIs para interagir com o SDK e atualizar a interface do usuário.
Você pode enviar uma mensagem usando qualquer uma das APIs send()
disponíveis na classe BotsManager
. Por exemplo, public func send(message: UserMessage)
envia uma mensagem de texto para a habilidade ou o assistente digital.
public func send(message: UserMessage)
Esta função envia uma mensagem para a habilidade. Seu parâmetro message
é uma instância de uma classe que está em conformidade com a classe UserMessage
. Nesse caso, é UserTextMessage
.BotsManager.shared().send(message: UserTextMessage(text: "I want to order a pizza", type: .text))
BotsEventListener
BotsEventListener
que implementa os seguintes métodos:
onStatusChange(ConnectionStatus connectionStatus)
– Este método é chamado quando o status da conexão WebSocket é alterado. Seu parâmetroconnectionStatus
é o status atual da conexão. Consulte os documentos da API incluídos no SDK para obter mais detalhes sobre a enumeraçãoConnectionStatus
.onReceiveMessage(message: BotsMessage)
– Este método é chamado quando uma nova mensagem é recebida da habilidade. Seu parâmetromessage
é a mensagem recebida da habilidade. Consulte os documentos da API incluídos no SDK para obter mais detalhes sobre a classeBotsMessage
.onUploadAttachment(message: BotsAttachmentMessage)
– Este método é chamado quando um upload de anexo é concluído. Seu parâmetromessage
é o objetoBotsAttachmentMessage
do anexo submetido a upload.onDestroy()
- Este método é chamado quando o métododestroy()
é chamado.onInitialize()
- Este método é chamado quando o métodoinitialize(botsConfiguration: BotsConfiguration, completionHandler: @escaping (ConnectionStatus, Error?) -> ())
é chamado. É necessário o seguinte parâmetro:newLanguage
- O objetoSupportedLanguage
para a linguagem de chat recém-definida.
beforeEndConversation()
- Este método é chamado quando a sessão de conversa final é iniciada.chatEnd()
- Um método de callback acionado após o término da conversa com sucesso.
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.
}
}
A instância, que está em conformidade com o protocolo BotsEventListener
deve ser designada à propriedade BotsManager.shared().botsEventListener
conforme ilustrado no trecho de código a seguir para inicializar o SDK:BotsManager.shared().botsEventListener = self
Webview In-Widget
Propriedade da IU: LinkHandler
Você pode configurar o comportamento do link em mensagens de chat para permitir que os usuários acessem páginas web dentro do widget de chat. Em vez de ter que alternar da conversa para exibir uma página em uma guia ou em outra janela do browser, um usuário pode permanecer no chat porque o widget de chat abre o link em uma webview.
Configurar o Webview In-Widget
Propriedade da IU: WebViewConfig
LinkHandler
como LinkHandlerType.webview
. WebViewConfig
pode ser definido como instância de estrutura 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
Como ilustrado neste trecho de código, você pode definir os atributos a seguir para a webview.Atributo | Definições |
---|---|
webViewSize |
Define o tamanho da tela da janela da webview in-widget com o atributo WebviewSize , que tem dois valores: parial (WebviewSize.partial ) e full (WebviewSizeWindow.full ).
|
clearButtonLabel |
Define o texto usado para o botão limpar/fechar no canto superior direito da webview. O texto padrão é obtido da string definida como odais_done no arquivo Localizable.strings .
|
clearButtonIcon |
Define um ícone para o botão Limpar, que aparece alinhado à esquerda dentro do botão. Por padrão, não há ícone definido para o botão Limpar. É uma string vazia. |
clearButtonLabelColor |
Define a cor do texto do label do botão Limpar. A cor padrão é UIColor.white .
|
clearButtonColor |
Define a cor do plano de fundo do botão Limpar. A cor padrão é UIColor.clear .
|
webviewHeaderColor |
Define a cor do plano de fundo do cabeçalho da webview. |
webviewTitleColor |
Define a cor do título no cabeçalho. O título é o URL do link web que foi aberto. |
Formatação de Timestamp da Mensagem
O flag timestampFormat
formata timestamps que são exibidos nas mensagens. Ela pode aceitar uma string que consiste em tokens de formato como "hh:mm:ss"
e outros formatos suportados pelo Swift DateFormatter.
Chat multilíngue
Flag do recurso: multiLangChat
O idioma nativo do iOS SDK permite que o widget de chat detecte o idioma de um usuário ou permita que os usuários selecionem o idioma da conversa. Os usuários podem alternar entre os idiomas, mas apenas entre as conversas, não durante, porque a conversa é redefinida sempre que um usuário seleciona um novo idioma.
Ativar o menu Language
multiLangChat
com um objeto que contém o array supportedLanguages
, que é composto por tags de idioma (lang
) e labels de exibição opcionais (label
). Fora desse array, você pode definir opcionalmente o idioma padrão com a variável primaryLanguage
(MultiLangChat(primaryLanguage: String)
no trecho de código a seguir). 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"
)
Para formatar corretamente os códigos de idioma e região em arquivos .lproj (projeto de localização) localizáveis, use um traço (
-
) como separador, e não um sublinhado (_
). Por exemplo, use fr-CA
, não fr_CA
. Isso se alinha à forma como os arquivos .lproj
são criados no aplicativo. Quando o SDK procura um arquivo .lproj
, ele primeiro tenta localizar um com o formato exato languageCode-Region.lproj
. Se ele não conseguir localizar esse arquivo, o SDK procurará um arquivo languageCode.lproj
. Se isso também não for encontrado, o SDK procurará um arquivo base.lproj
. Quando nenhum deles pode ser localizado, o SDK usa o inglês como padrão (en
).
Em um menu drop-down localizado no cabeçalho, o widget de chat exibe os idiomas suportados transmitidos. Além dos idiomas disponíveis, o menu também inclui uma opção Detectar Idioma. Quando um usuário seleciona um idioma nesse menu, a conversa atual é redefinida e uma nova conversa é iniciada com o idioma selecionado. O idioma selecionado pelo usuário persiste entre as sessões no mesmo browser; por isso, o idioma anterior do usuário é selecionado automaticamente quando o usuário visita de novo a habilidade por meio da página que contém o widget de chat.
Você pode adicionar um listener de eventos para o evento onChatLanguageChange
, que é acionado quando um idioma de bate-papo é selecionado no menu suspenso ou foi alterado.
- Defina no mínimo dois idiomas para permitir a exibição do menu drop-down.
- Se você omitir o atributo
primaryLanguage
, o widget detectará automaticamente o idioma no perfil do usuário e selecionará a opção Detect Language no menu. - A chave
label
é opcional para os idiomas suportados nativamente:fr
é exibido como Francês no menu,es
é exibido como Espanhol e assim por diante. - Embora
label
seja opcional, se você tiver adicionado um idioma que não seja um dos suportados nativamente, adicione um rótulo para identificar a tag. Por exemplo, se você não definirlabel: 'हिंदी'
, paralang: "hi"
, o menu drop-down exibirá hi, contribuindo para uma experiência de usuário abaixo do ideal.
Desativar Menu de Idioma
A partir da Versão 21.12, você também pode configurar e atualizar o idioma de bate-papo sem precisar também configurar o menu suspenso de seleção de idioma informando MultiLangChat(primaryLanguage: String)
.
Detecção de Idioma
Além dos idiomas informados, o widget de chat exibe uma opção Detectar Idioma no menu drop-down. A seleção dessa opção instrui a habilidade a detectar automaticamente o idioma da conversa da mensagem do usuário e, quando possível, responder no mesmo idioma.
Você pode atualizar dinamicamente o idioma selecionado chamando a API BotsManager.shared().setPrimaryLanguage(primaryLanguage: String)
. Se o lang
informado corresponder a um dos idiomas suportados, esse idioma será selecionado. Quando nenhuma correspondência for encontrada, Detectar Idioma será ativado. Você também pode ativar a opção Idioma Detectado chamando a API BotsManager.shared().setPrimaryLanguage(primaryLanguage: "und")
, em que "und"
indica indeterminado ou informando primaryLanguage:nil
.
Você pode atualizar o idioma de bate-papo dinamicamente usando a API setPrimaryLanguage(primaryLanguage: String)
mesmo quando o menu suspenso não tiver sido configurado.
Referência Rápida de Chat Multilingual
Para isso... | ... Faça isto |
---|---|
Exibe o menu suspenso de seleção de idioma para usuários finais. | Informe MultiLangChat(supportedLanguages: [SupportedLanguage]) .
|
Defina o idioma do bate-papo sem exibir o menu suspenso de seleção de idioma para os usuários finais. | Informe MultiLangChat(primaryLanguage: String) .
|
Definir um idioma padrão. | Informe MultiLangChat(supportedLanguages: [SupportedLanguage], primaryLanguage: String) .
|
Ativar detecção de idioma. | Informe primaryLanguage:nil ou primaryLanguage:"und" .
|
Atualize dinamicamente o idioma do chat. | Chame a API setPrimaryLanguage(primaryLanguage: String) .
|
Substituindo um formulário de entrada anterior
Quando o usuário final envia o formulário, porque um campo tem autosubmit
definido como true
, a habilidade pode enviar um novo EditFormMessagePayload
. Essa mensagem deve substituir a mensagem anterior do formulário de entrada. Definindo a propriedade de extensão do canal replaceMessage
como true
, você ativa o SDK para substituir a mensagem anterior do form de entrada pela mensagem atual do form de entrada.
Opções do Menu Compartilhar
- arquivos de mídia visual (imagens e vídeos)
- arquivos de áudio
- arquivos gerais, como documentos, PDFs e planilhas
- localização
sharePopupConfiguration
permite restringir os itens exibidos no menu de compartilhamento. Ao especificar uma tupla de arrays para ShareMenuConfiguration
-- shareMenuConfiguration = ([ShareMenuItem], [ShareMenuCustomItem])
-- você pode restringir, ou filtrar, o tipo de itens disponíveis no menu, personalizar os ícones e os labels do menu e limitar o tamanho do arquivo de upload. A tupla tem um array de opções de menu de compartilhamento do tipo ShareMenuItem
e um array de opções de menu de compartilhamento do tipo ShareMenuCustomItem
. Informe um array vazio para todos os tipos de arquivo.
Reconhecimento de Fala
- Flag do recurso:
enableSpeechRecognition
- Configuração da funcionalidade:
enableAutoSendSpeechResponse
A definição do flag do recurso enableSpeechRecognition
como true
permite que o botão de microfone seja exibido no lugar do botão Enviar sempre que o campo de entrada do usuário estiver vazio. A fala é convertida em texto e enviada para a habilidade ou o assistente digital. Se a fala for parcialmente reconhecida, o resultado parcial será exibido em um pop-up que é aberto clicando no botão de microfone.
A definição dessa propriedade como true
também suporta a funcionalidade ativada pela propriedade enableAutoSendSpeechResponse
, que quando também está definida como true
, permite que a resposta de fala do usuário seja enviada ao servidor de chat automaticamente enquanto exibe a resposta como uma mensagem enviada na janela de chat. Você pode permitir que os usuários editem (ou excluam) primeiro suas mensagens ditadas antes de enviá-las manualmente, definindo enableSpeechRecognitionAutoSend
como false
.
public func isRecording() -> Bool
Verifica se a gravação de voz foi iniciada ou não. Retorna true
se a gravação tiver sido iniciada. Caso contrário, retorna false
.
onSpeechResponseReceived(data: String, final: Bool)
do protocolo BotsEventListener
pode ser usada para tratar todas as respostas do servidor de fala.BotsManager.shared().startRecording()
if (BotsManager.shared().isRecording()) {
BotsManager.shared().stopRecording() // Stop voice recording
}
Síntese de Fala
- Flag do recurso:
enableSpeechSynthesis
- Configuração da funcionalidade:
speechSynthesisVoicePreferences
- Você habilita esse recurso definindo o flag do recurso
enableSpeechSynthesis
comotrue
. - Você pode definir o idioma preferencial que lê as mensagens da habilidade em voz alta com a propriedade
speechSynthesisVoicePreferences
. Esta propriedade ativa um fallback quando o dispositivo não suporta o idioma ou a voz preferenciais. Se o dispositivo não suportar a voz preferencial, será usada a voz padrão do idioma preferencial. Quando não há suporte nem para a voz nem para o idioma preferenciais, a voz e o idioma padrão são usados.
Injeção de Serviço de Fala
Flag do recurso: ttsService
O flag do recurso ttsService
permite que você injete qualquer serviço de conversão de texto em fala (TTS) - seu próprio serviço ou fornecido por um fornecedor de terceiros - no SDK. Para injetar um serviço TTS, primeiro defina o flag do recurso enableSpeechSynthesis
como true
e, em seguida, informe uma instância da interface TTSService
para o flag ttsService
.
O Protocolo TTSService
TTSService
. Ele implementa os seguintes métodos:
speak(text: String)
- Este método adiciona o texto a ser falado para a fila de declarações. Seu parâmetrotext
é o texto a ser falado.isSpeaking()
- Este método verifica se a resposta de áudio está ou não sendo falada. Ele retornaráfalse
se nenhuma resposta de áudio estiver sendo falada.stopSpeech()
- Este método interrompe qualquer síntese de fala em andamento.
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.
}
}
Indicador de Digitação para Conversas do Agente do Usuário
Flag do recurso: enableSendTypingStatus
Quando esse flag está ativado, o SDK envia um evento de digitação RESPONDING
junto com o texto que está sendo digitado no momento pelo usuário para o Oracle B2C Service ou o Oracle Fusion Service. Isso mostra um indicador de digitação no console do agente. Quando o usuário terminar de digitar, o SDK enviará um evento LISTENING
ao serviço. Isso oculta o indicador de digitação no console do agente.
Da mesma forma, quando o agente está digitando, o SDK recebe um evento RESPONDING
do serviço. Ao receber este evento, o SDK mostra um indicador de digitação para o usuário. Quando o agente está ocioso, o SDK recebe o evento LISTENING
do serviço. Ao receber este evento, o SDK oculta o indicador de digitação mostrado ao usuário.
sendUserTypingStatus
permite o mesmo comportamento para o modo sem interface do usuário. public func sendUserTypingStatus(status: TypingStatus, text: String? = nil)
- Para mostrar o indicador de digitação no console do agente:
BotsManager.shared().sendUserTypingStatus(status: .RESPONDING, text: textToSend)
- Para ocultar o indicador de digitação no console do agente:
BotsManager.shared().sendUserTypingStatus(status: .LISTENING)
- Para controlar o indicador de digitação do lado do usuário, use o evento
onReceiveMessage()
. Por exemplo :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
que fornecem controle adicional:
typingStatusInterval
– Por padrão, o SDK envia o evento de digitaçãoRESPONDING
a cada três segundos para o Oracle B2C Service. Use este flag para acelerar este evento. O valor mínimo que pode ser definido é três segundos.enableAgentSneakPreview
- O Oracle B2C Service suporta mostrar o texto do usuário à medida que ele é informado. Se esse flag for definido comotrue
(o padrão éfalse
), o SDK enviará o texto real. Para proteger a privacidade do usuário, o SDK envia...
em vez do texto para o Oracle B2C Service quando o flag é definido comofalse
.
Visualizador de Voz
Quando o suporte a voz está ativado (botsConfiguration.enableSpeechRecognition = true
), o rodapé do widget de chat exibe um visualizador de voz, um gráfico de visualizador dinâmico que indica o nível de frequência da entrada de voz. O visualizador responde à modulação da voz do usuário, indicando se o usuário está falando muito baixo ou muito alto. Este visualizador é criado usando o AVAudioEngine do Swift que é exposto no método onAudioReceived
no protocolo SpeechEventListener
para uso no modo sem interface do usuário.
O modo de voz é indicado quando o ícone de teclado aparece.
Quando botsConfiguration.enableSpeechAutoSendSpeechResponse = true
, o texto reconhecido é enviado automaticamente para a habilidade depois que o usuário termina de ditar a mensagem. Em seguida, o modo é revertido para entrada de texto. Quando botsConfiguration.enableSpeechAutoSendSpeechResponse = false
, o modo também é revertido para entrada de texto, mas nesse caso, os usuários podem modificar o texto reconhecido antes de enviar a mensagem para a habilidade.