API bidirecional

A API BiDiStreamingAnalyzeContent é a principal para experiências de áudio e multimodais de última geração nos agentes de conversa e no Agent Assist. Essa API facilita o streaming de dados de áudio e retorna transcrições ou sugestões de agentes humanos.

Ao contrário das APIs anteriores, a configuração de áudio simplificada tem suporte otimizado para conversas entre pessoas e um limite de prazo estendido de 15 minutos. Exceto pela tradução simultânea, essa API também é compatível com todos os recursos do Assistente do agente que o StreamingAnalyzeContent oferece.

Princípios básicos de streaming

O diagrama a seguir ilustra como o stream funciona.

Inicie um stream enviando uma configuração de áudio para o servidor. Em seguida, você envia arquivos de áudio, e o servidor envia uma transcrição ou sugestões para um agente humano. Envie mais dados de áudio para receber mais transcrições e sugestões. Essa troca continua até que você a encerre fechando parcialmente o stream.

Guia de streaming

Para usar a API BiDiStreamingAnalyzeContent durante a execução da conversa, siga estas diretrizes.

  1. Chame o método BiDiStreamingAnalyzeContent e defina os seguintes campos:
    • BiDiStreamingAnalyzeContentRequest.participant
    • (Opcional) BiDiStreamingAnalyzeContentRequest.voice_session_config.input_audio_sample_rate_hertz. Quando especificado, substitui a configuração de ConversationProfile.stt_config.sample_rate_hertz.
    • (Opcional) BiDiStreamingAnalyzeContentRequest.voice_session_config.input_audio_encoding. Quando especificado, substitui a configuração de ConversationProfile.stt_config.audio_encoding.
  2. Prepare o fluxo e defina a configuração de áudio com sua primeira solicitação BiDiStreamingAnalyzeContent.
  3. Em solicitações subsequentes, envie bytes de áudio para o stream usando BiDiStreamingAnalyzeContentRequest.audio.
  4. Depois de enviar a segunda solicitação com uma carga útil de áudio, você vai receber alguns BidiStreamingAnalyzeContentResponses do fluxo.
    • Os resultados intermediários e finais da transcrição estão disponíveis com o seguinte comando: BiDiStreamingAnalyzeContentResponse.recognition_result.
    • É possível acessar sugestões de agentes humanos e mensagens de conversa processadas com o seguinte comando: BiDiStreamingAnalyzeContentResponse.analyze_content_response.
  5. É possível fechar parcialmente o stream a qualquer momento. Depois de fechar parcialmente o fluxo, o servidor envia de volta a resposta com os resultados de reconhecimento restantes e possíveis sugestões do Assistente do agente.
  6. Inicie ou reinicie uma nova transmissão nos seguintes casos:
    • O stream está com problemas. Por exemplo, o stream foi interrompido quando não deveria.
    • Sua conversa está se aproximando do limite de 15 minutos.
  7. Para ter a melhor qualidade, ao iniciar uma transmissão, envie dados de áudio gerados após o último speech_end_offset do BiDiStreamingAnalyzeContentResponse.recognition_result com is_final=true para BidiStreamingAnalyzeContent.

Usar a API com a biblioteca de cliente Python

As bibliotecas de cliente ajudam você a acessar as APIs do Google em uma linguagem de programação específica. Você pode usar a biblioteca de cliente Python para o Assistente do agente com BidiStreamingAnalyzeContent da seguinte maneira.

from google.cloud import dialogflow_v2beta1
from google.api_core.client_options import ClientOptions
from google.cloud import storage

import time
import google.auth
import participant_management
import conversation_management


PROJECT_ID="your-project-id"
CONVERSATION_PROFILE_ID="your-conversation-profile-id"
BUCKET_NAME="your-audio-bucket-name"

SAMPLE_RATE =48000
# Calculate the bytes with Sample_rate_hertz * bit Depth / 8 -> bytes
# 48000(sample/second) * 16(bits/sample) / 8 = 96000 byte per second,
# 96000 / 10 = 9600 we send 0.1 second to the stream API
POINT_ONE_SECOND_IN_BYTES = 9600
FOLDER_PTAH_FOR_CUSTOMER_AUDIO="your-customer-audios-files-path" 
FOLDER_PTAH_FOR_AGENT_AUDIO="your-agent-audios-file-path"
client_options = ClientOptions(api_endpoint="dialogflow.googleapis.com")
credentials, _ = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform",
                                             "https://www.googleapis.com/auth/dialogflow"])

storage_client = storage.Client(credentials = credentials, project=PROJECT_ID)

participant_client = dialogflow_v2beta1.ParticipantsClient(client_options=client_options,
                                                           credentials=credentials)

def download_blob(bucket_name, folder_path, audio_array : list):
    """Uploads a file to the bucket."""
    bucket = storage_client.bucket(bucket_name, user_project=PROJECT_ID)
    blobs = bucket.list_blobs(prefix=folder_path)
    for blob in blobs:
      if not blob.name.endswith('/'):
          audio_array.append(blob.download_as_string())

def request_iterator(participant : dialogflow_v2beta1.Participant, audios):
    """Iterate the request for bidi streaming analyze content
    """

    yield dialogflow_v2beta1.BidiStreamingAnalyzeContentRequest(
        config={
            "participant": participant.name,
            "voice_session_config": {
                "input_audio_encoding": dialogflow_v2beta1.AudioEncoding.AUDIO_ENCODING_LINEAR_16,
                "input_audio_sample_rate_hertz": SAMPLE_RATE,
            },
        }
    )
    print(f"participant {participant}")

    for i in range(0, len(audios)):
      audios_array = audio_request_iterator(audios[i])
      for chunk in audios_array:
        if not chunk:
            break
        yield dialogflow_v2beta1.BidiStreamingAnalyzeContentRequest(
        input={
            "audio":chunk
            },
        )
        time.sleep(0.1)
    yield dialogflow_v2beta1.BidiStreamingAnalyzeContentRequest(
        config={
            "participant": participant.name,
        }
    )
    time.sleep(0.1)

def participant_bidi_streaming_analyze_content(participant, audios):
    """call bidi streaming analyze content API
    """
    bidi_responses = participant_client.bidi_streaming_analyze_content(
        requests=request_iterator(participant, audios)
    )

    for response in bidi_responses:
        bidi_streaming_analyze_content_response_handler(response)

def bidi_streaming_analyze_content_response_handler(response: dialogflow_v2beta1.BidiStreamingAnalyzeContentResponse):
    """Call Bidi Streaming Analyze Content
    """
    if  response.recognition_result:
         print(f"Recognition result: { response.recognition_result.transcript}", )

def audio_request_iterator(audio):
    """Iterate the request for bidi streaming analyze content
    """
    total_audio_length = len(audio)
    print(f"total audio length {total_audio_length}")
    array = []
    for i in range(0, total_audio_length, POINT_ONE_SECOND_IN_BYTES):
        chunk = audio[i : i + POINT_ONE_SECOND_IN_BYTES]
        array.append(chunk)
        if not chunk:
            break
    return array

def python_client_handler():
    """Downloads audios from the google cloud storage bucket and stream to
    the Bidi streaming AnalyzeContent site.
    """
    print("Start streaming")
    conversation = conversation_management.create_conversation(
        project_id=PROJECT_ID, conversation_profile_id=CONVERSATION_PROFILE_ID_STAGING
    )
    conversation_id = conversation.name.split("conversations/")[1].rstrip()
    human_agent = human_agent = participant_management.create_participant(
        project_id=PROJECT_ID, conversation_id=conversation_id, role="HUMAN_AGENT"
    )

    end_user =    end_user = participant_management.create_participant(
        project_id=PROJECT_ID, conversation_id=conversation_id, role="END_USER"
    )

    end_user_requests = []
    agent_request= []
    download_blob(BUCKET_NAME, FOLDER_PTAH_FOR_CUSTOMER_AUDIO, end_user_requests)
    download_blob(BUCKET_NAME, FOLDER_PTAH_FOR_AGENT_AUDIO, agent_request)

    participant_bidi_streaming_analyze_content( human_agent, agent_request)
    participant_bidi_streaming_analyze_content( end_user, end_user_requests)

    conversation_management.complete_conversation(PROJECT_ID, conversation_id)

Ativar a integração do SipRec para telefonia

É possível ativar a integração de telefonia SipRec para usar o BidiStreamingAnalyzeContent no processamento de áudio. Configure o processamento de áudio com o console do Assistente de agente ou uma solicitação direta da API.

Console

Siga estas etapas para configurar o processamento de áudio e usar BidiStreamingAnalyzeContent.

  1. Acesse o console da Assistente de agente e selecione seu projeto.

    Console do Agent Assist

  2. Clique em Perfis de conversa > o nome de um perfil.

  3. Acesse Configurações de telefonia.

  4. Clique para ativar a opção Usar a API Bidirectional Streaming> Salvar.

API

É possível chamar a API diretamente para criar ou atualizar um perfil de conversa configurando a flag em ConversationProfile.use_bidi_streaming.

Exemplo de configuração:

{
"name": "projects/PROJECT_ID/locations/global/conversationProfiles/CONVERSATION_PROFILE_ID",f
"displayName": "CONVERSATION_PROFILE_NAME",
"automatedAgentConfig": {
},
"humanAgentAssistantConfig": {
  "notificationConfig": {
    "topic": "projects/PROJECT_ID/topics/FEATURE_SUGGESTION_TOPIC_ID",
    "messageFormat": "JSON"
      },
  },
"useBidiStreaming": true,
"languageCode": "en-US"
}

Cotas

O número de solicitações simultâneas de BidiStreamingAnalyzeContent é limitado por uma nova cota ConcurrentBidiStreamingSessionsPerProjectPerRegion. Consulte o Google Cloud guia de cotas para informações sobre o uso de cotas e como solicitar um aumento no limite.

Para cotas, o uso de solicitações BidiStreamingAnalyzeContent ao endpoint global do Dialogflow está na região us-central1.