Adicione melhorias na qualidade de áudio à sua experiência de chamadas de áudio
As capacidades de supressão de ruído de efeitos de áudio dos Serviços de Comunicação do Azure podem melhorar as suas chamadas de áudio filtrando ruídos de fundo indesejados. A supressão de ruído é uma tecnologia que remove ruídos de fundo de chamadas de áudio. Torna as chamadas de áudio mais claras e melhores, eliminando o ruído de fundo, tornando mais fácil falar e ouvir. A supressão do ruído também pode reduzir as distrações e o cansaço causados por locais ruidosos. Por exemplo, se você estiver atendendo uma chamada WebJS dos Serviços de Comunicação do Azure em uma cafeteria com ruído considerável, ativar a supressão de ruído pode melhorar a experiência da chamada.
Importante
A funcionalidade descrita neste artigo está atualmente em visualização pública. Esta versão de pré-visualização é fornecida sem um contrato de nível de serviço e não a recomendamos para cargas de trabalho de produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.
Usando efeitos de áudio - supressão de ruído
Instalar o pacote npm
Use o npm install
comando para instalar o SDK de Efeitos de Áudio dos Serviços de Comunicação do Azure para JavaScript.
Importante
Este tutorial usa a versão do SDK de Chamada dos Serviços de Comunicação do Azure de (ou superior) e a versão do SDK de Efeitos de Áudio dos Serviços de 1.24.2-beta.1
Comunicação do Azure maior ou igual a 1.1.1-beta.1
(ou superior).
@azure/communication-calling-effects@1.1.1-beta
Nota
A biblioteca de efeitos de chamada não pode ser usada de forma autônoma e só pode funcionar quando usada com a biblioteca de cliente do Azure Communication Calling para WebJS (https://www.npmjs.com/package/@azure/communication-calling).
Você pode encontrar mais detalhes na página do pacote npm de efeitos de chamada.
Nota
O suporte atual do navegador para adicionar efeitos de supressão de ruído de áudio só está disponível nos navegadores Chrome e Edge Desktop.
Você pode aprender sobre as especificidades da API de chamada.
Para usar noise suppression
efeitos de áudio no SDK de Chamada de Comunicação do Azure, você precisa do LocalAudioStream
que está atualmente na chamada. Você precisa acessar a AudioEffects
API do para iniciar e parar efeitos de LocalAudioStream
áudio.
import * as AzureCommunicationCallingSDK from '@azure/communication-calling';
import { DeepNoiseSuppressionEffect } from '@azure/communication-calling-effects';
// Get the LocalAudioStream from the localAudioStream collection on the call object
// 'call' here represents the call object.
const localAudioStreamInCall = call.localAudioStreams[0];
// Get the audio effects feature API from LocalAudioStream
const audioEffectsFeatureApi = localAudioStreamInCall.feature(SDK.Features.AudioEffects);
// Subscribe to useful events that show audio effects status
audioEffectsFeatureApi.on('effectsStarted', (activeEffects: ActiveAudioEffects) => {
console.log(`Current status audio effects: ${activeEffects}`);
});
audioEffectsFeatureApi.on('effectsStopped', (activeEffects: ActiveAudioEffects) => {
console.log(`Current status audio effects: ${activeEffects}`);
});
audioEffectsFeatureApi.on('effectsError', (error: AudioEffectErrorPayload) => {
console.log(`Error with audio effects: ${error.message}`);
});
A qualquer momento, se você quiser verificar quais efeitos de supressão de ruído estão ativos no momento, você pode usar a activeEffects
propriedade.
A activeEffects
propriedade retorna um objeto com os nomes dos efeitos ativos atuais.
// Using the audio effects feature api
const currentActiveEffects = audioEffectsFeatureApi.activeEffects;
Iniciar uma chamada com a Supressão de Ruído ativada
Para iniciar uma chamada com a supressão de ruído ativada, você pode criar uma nova LocalAudioStream
com um AudioDeviceInfo
(a fonte LocalAudioStream não deve ser bruta MediaStream
para usar efeitos de áudio) e passá-la no CallStartOptions.audioOptions
:
// As an example, here we are simply creating a LocalAudioStream using the current selected mic on the DeviceManager
const audioDevice = deviceManager.selectedMicrophone;
const localAudioStreamWithEffects = new SDK.LocalAudioStream(audioDevice);
const audioEffectsFeatureApi = localAudioStreamWithEffects.feature(SDK.Features.AudioEffects);
// Start effect
await audioEffectsFeatureApi.startEffects({
noiseSuppression: deepNoiseSuppression
});
// Pass the LocalAudioStream in audioOptions in call start/accept options.
await call.startCall({
audioOptions: {
muted: false,
localAudioStreams: [localAudioStreamWithEffects]
}
});
Como ativar a supressão de ruído durante uma chamada em curso
Há situações em que um usuário pode iniciar uma chamada e não ter a supressão de ruído ativada, mas seu ambiente atual pode ficar barulhento, resultando na necessidade de ativar a supressão de ruído. Para ativar a supressão de ruído, você pode usar a audioEffectsFeatureApi.startEffects
API.
// Create the noise supression instance
const deepNoiseSuppression = new DeepNoiseSuppressionEffect();
// Its recommened to check support for the effect in the current environment using the isSupported method on the feature API. Remember that Noise Supression is only supported on Desktop Browsers for Chrome and Edge
const isDeepNoiseSuppressionSupported = await audioEffectsFeatureApi.isSupported(deepNoiseSuppression);
if (isDeepNoiseSuppressionSupported) {
console.log('Noise supression is supported in browser environment');
}
// To start ACS Deep Noise Suppression,
await audioEffectsFeatureApi.startEffects({
noiseSuppression: deepNoiseSuppression
});
// To stop ACS Deep Noise Suppression
await audioEffectsFeatureApi.stopEffects({
noiseSuppression: true
});
Saiba como configurar os filtros de áudio com os SDKs nativos de chamada.
Os efeitos de áudio dos Serviços de Comunicação do Azure oferecem filtros que podem melhorar sua chamada de áudio. Para plataformas nativas (Android, iOS ou Windows) você pode configurar os seguintes filtros:
Cancelamento de eco
Ele elimina o eco acústico causado pela voz do chamador ecoando de volta para o microfone depois de ser emitida pelo alto-falante, garantindo uma comunicação clara.
Você pode configurar o filtro antes e durante uma chamada. Só pode alternar o cancelamento de eco se o modo de música estiver ativado. Por padrão, esse filtro está habilitado.
Supressão de ruído
Melhore a qualidade do áudio filtrando ruídos de fundo indesejados, como digitação, ar condicionado ou sons de rua. Esta tecnologia garante que a voz é nítida e clara, facilitando uma comunicação mais eficaz.
Você pode configurar o filtro antes e durante uma chamada. Os modos atualmente disponíveis são Off
, Auto
, Low
, e High
. Por padrão, esse recurso é definido como High
modo.
Controle automático de ganho (AGC)
Ajusta automaticamente o volume do microfone para garantir níveis de áudio consistentes durante toda a chamada.
- O controle de ganho automático analógico é um filtro disponível apenas antes de uma chamada. Por padrão, esse filtro está habilitado.
- O controle de ganho automático digital é um filtro disponível apenas antes de uma chamada. Por padrão, esse filtro está habilitado.
Modo Música
O modo de música é um filtro disponível antes e durante uma chamada. Saiba mais sobre o modo de música aqui. O modo de música só funciona em plataformas nativas sobre 1n1 ou chamadas em grupo e não funciona em chamadas 1:1 entre nativos e web. Por padrão, o modo de música está desativado.
Pré-requisitos
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente
- Um recurso de Serviços de Comunicação implantado. Criar um recurso de Serviços de Comunicação
- Um token de acesso de usuário para habilitar o cliente chamador. Para obter mais informações, consulte Criar e gerenciar tokens de acesso.
- Opcional: conclua o início rápido para adicionar chamadas de voz ao seu aplicativo
Instale o SDK
Localize seu arquivo build.gradle no nível do projeto e adicione mavenCentral()
à lista de repositórios em buildscript
e allprojects
:
buildscript {
repositories {
...
mavenCentral()
...
}
}
allprojects {
repositories {
...
mavenCentral()
...
}
}
Em seguida, no arquivo build.gradle no nível do módulo, adicione as seguintes linhas à dependencies
seção :
dependencies {
...
implementation 'com.azure.android:azure-communication-calling:1.0.0'
...
}
Inicializar os objetos necessários
Para criar uma CallAgent
instância, você precisa chamar o createCallAgent
método em uma CallClient
instância. Essa chamada retorna de forma assíncrona um objeto de CallAgent
instância.
O createCallAgent
método toma CommunicationUserCredential
como um argumento, que encapsula um token de acesso.
Para acessar DeviceManager
o , você deve criar uma callAgent
instância primeiro. Então você pode usar o CallClient.getDeviceManager
método para obter DeviceManager
.
String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential).get();
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
Para definir um nome de exibição para o chamador, use este método alternativo:
String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisplayName("Alice Bob");
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential, callAgentOptions).get();
O recurso de filtro de áudio permite que você aplique diferentes opções de pré-processamento de áudio ao áudio de saída. Existem dois tipos de filtros de áudio: OutgoingAudioFilters
e LiveOutgoingAudioFilters
. Use OutgoingAudioFilters
para alterar as configurações antes do início da chamada e LiveOutgoingAudioFilters
para alterar as configurações enquanto uma chamada está em andamento.
Primeiro, você precisa importar o SDK de chamada e as classes associadas:
import com.azure.android.communication.calling.OutgoingAudioOptions;
import com.azure.android.communication.calling.OutgoingAudioFilters;
import com.azure.android.communication.calling.LiveOutgoingAudioFilters;
Antes do início da chamada
OutgoingAudioFilters
pode ser aplicado quando uma chamada é iniciada.
Comece criando um OutgoingAudioFilters
e passando-o para OutgoingAudioOptions conforme mostrado no código a seguir:
OutgoingAudioOptions outgoingAudioOptions = new OutgoingAudioOptions();
OutgoingAudioFilters filters = new OutgoingAudioFilters();
filters.setNoiseSuppressionMode(NoiseSuppressionMode.HIGH);
filters.setAnalogAutomaticGainControlEnabled(true);
filters.setDigitalAutomaticGainControlEnabled(true);
filters.setMusicModeEnabled(true);
filters.setAcousticEchoCancellationEnabled(true);
outgoingAudioOptions.setAudioFilters(filters);
Durante a chamada
Pode candidatar-se LiveOutgoingAudioFilters
após o início de uma chamada. Você pode recuperar esse objeto do objeto de chamada durante a chamada. Para alterar a configuração no LiveOutgoingAudioFilters
, defina os membros dentro da classe para um valor válido e eles serão aplicados.
Apenas um subconjunto dos filtros disponíveis estão disponíveis durante uma chamada ativa: modo de música, cancelamento de eco e modo de supressão de OutgoingAudioFilters
ruído.
LiveOutgoingAudioFilters filters = call.getLiveOutgoingAudioFilters();
filters.setMusicModeEnabled(false);
filters.setAcousticEchoCancellationEnabled(false);
filters.setNoiseSuppressionMode(NoiseSuppressionMode.HIGH);
Saiba como configurar os filtros de áudio com os SDKs nativos de chamada.
Os efeitos de áudio dos Serviços de Comunicação do Azure oferecem filtros que podem melhorar sua chamada de áudio. Para plataformas nativas (Android, iOS ou Windows) você pode configurar os seguintes filtros:
Cancelamento de eco
Ele elimina o eco acústico causado pela voz do chamador ecoando de volta para o microfone depois de ser emitida pelo alto-falante, garantindo uma comunicação clara.
Você pode configurar o filtro antes e durante uma chamada. Só pode alternar o cancelamento de eco se o modo de música estiver ativado. Por padrão, esse filtro está habilitado.
Supressão de ruído
Melhore a qualidade do áudio filtrando ruídos de fundo indesejados, como digitação, ar condicionado ou sons de rua. Esta tecnologia garante que a voz é nítida e clara, facilitando uma comunicação mais eficaz.
Você pode configurar o filtro antes e durante uma chamada. Os modos atualmente disponíveis são Off
, Auto
, Low
, e High
. Por padrão, esse recurso é definido como High
modo.
Controle automático de ganho (AGC)
Ajusta automaticamente o volume do microfone para garantir níveis de áudio consistentes durante toda a chamada.
- O controle de ganho automático analógico é um filtro disponível apenas antes de uma chamada. Por padrão, esse filtro está habilitado.
- O controle de ganho automático digital é um filtro disponível apenas antes de uma chamada. Por padrão, esse filtro está habilitado.
Modo Música
O modo de música é um filtro disponível antes e durante uma chamada. Saiba mais sobre o modo de música aqui. O modo de música só funciona em plataformas nativas sobre 1n1 ou chamadas em grupo e não funciona em chamadas 1:1 entre nativos e web. Por padrão, o modo de música está desativado.
Pré-requisitos
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente
- Um recurso de Serviços de Comunicação implantado. Criar um recurso de Serviços de Comunicação
- Um token de acesso de usuário para habilitar o cliente chamador. Para obter mais informações, consulte Criar e gerenciar tokens de acesso.
- Opcional: conclua o início rápido para adicionar chamadas de voz ao seu aplicativo
Configure o seu sistema
Criar o projeto Xcode
No Xcode, crie um novo projeto iOS e selecione o modelo Single View App . Este início rápido usa a estrutura SwiftUI, portanto, você deve definir Language como Swift e Interfacecomo SwiftUI.
Você não vai criar testes durante este início rápido. Sinta-se à vontade para desmarcar a caixa de seleção Incluir testes .
Instale o pacote e as dependências usando o CocoaPods
Crie um Podfile para seu aplicativo, como este exemplo:
platform :ios, '13.0' use_frameworks! target 'AzureCommunicationCallingSample' do pod 'AzureCommunicationCalling', '~> 1.0.0' end
Execute o
pod install
.Abra
.xcworkspace
usando o Xcode.
Solicitar acesso ao microfone
Para acessar o microfone do dispositivo, você precisa atualizar a lista de propriedades de informações do seu aplicativo usando NSMicrophoneUsageDescription
. Você define o valor associado para uma cadeia de caracteres que será incluída na caixa de diálogo que o sistema usa para solicitar acesso do usuário.
Clique com o botão direito do mouse na entrada Info.plist da árvore do projeto e selecione Abrir como>código-fonte. Adicione as seguintes linhas na secção de nível <dict>
superior e, em seguida, guarde o ficheiro.
<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>
Configurar a estrutura do aplicativo
Abra o arquivo ContentView.swift do seu projeto. Adicione uma import
declaração à parte superior do arquivo para importar a AzureCommunicationCalling
biblioteca. Além disso, importe AVFoundation
. Você precisará dele para solicitações de permissão de áudio no código.
import AzureCommunicationCalling
import AVFoundation
Inicializar o CallAgent
Para criar uma CallAgent
instância a partir do CallClient
, você precisa usar um callClient.createCallAgent
método que retorna de forma assíncrona um CallAgent
objeto depois que ele é inicializado.
Para criar um cliente de chamada, passe um CommunicationTokenCredential
objeto:
import AzureCommunication
let tokenString = "token_string"
var userCredential: CommunicationTokenCredential?
do {
let options = CommunicationTokenRefreshOptions(initialToken: token, refreshProactively: true, tokenRefresher: self.fetchTokenSync)
userCredential = try CommunicationTokenCredential(withOptions: options)
} catch {
updates("Couldn't created Credential object", false)
initializationDispatchGroup!.leave()
return
}
// tokenProvider needs to be implemented by Contoso, which fetches a new token
public func fetchTokenSync(then onCompletion: TokenRefreshOnCompletion) {
let newToken = self.tokenProvider!.fetchNewToken()
onCompletion(newToken, nil)
}
Passe o CommunicationTokenCredential
objeto que você criou para CallClient
e defina o nome para exibição:
self.callClient = CallClient()
let callAgentOptions = CallAgentOptions()
options.displayName = " iOS Azure Communication Services User"
self.callClient!.createCallAgent(userCredential: userCredential!,
options: callAgentOptions) { (callAgent, error) in
if error == nil {
print("Create agent succeeded")
self.callAgent = callAgent
} else {
print("Create agent failed")
}
})
O recurso de filtro de áudio permite que você aplique diferentes opções de pré-processamento de áudio ao áudio de saída. Existem dois tipos de filtros de áudio: OutgoingAudioFilters
e LiveOutgoingAudioFilters
. Use OutgoingAudioFilters
para alterar as configurações antes do início da chamada e LiveOutgoingAudioFilters
para alterar as configurações enquanto uma chamada está em andamento.
Primeiro, você precisa importar o SDK de chamada:
import AzureCommunicationCalling
Antes do início da chamada
OutgoingAudioFilters
pode ser aplicado quando uma chamada é iniciada.
Comece criando um OutgoingAudioFilters
e passando-o para OutgoingAudioOptions conforme mostrado no código a seguir:
let outgoingAudioOptions = OutgoingAudioOptions()
let filters = OutgoingAudioFilters()
filters.NoiseSuppressionMode = NoiseSuppressionMode.high
filters.analogAutomaticGainControlEnabled = true
filters.digitalAutomaticGainControlEnabled = true
filters.musicModeEnabled = true
filters.acousticEchoCancellationEnabled = true
outgoingAudioOptions.audioFilters = filters
Durante a chamada
Pode candidatar-se LiveOutgoingAudioFilters
após o início de uma chamada. Você pode recuperar esse objeto do objeto de chamada durante a chamada. Para alterar a configuração no LiveOutgoingAudioFilters
, defina os membros dentro da classe para um valor válido e eles serão aplicados.
Apenas um subconjunto dos filtros disponíveis estão disponíveis durante uma chamada ativa: modo de música, cancelamento de eco e modo de supressão de OutgoingAudioFilters
ruído.
LiveOutgoingAudioFilters filters = call.liveOutgoingAudioFilters
filters.musicModeEnabled = true
filters.acousticEchoCancellationEnabled = true
filters.NoiseSuppressionMode = NoiseSuppressionMode.high
Saiba como configurar os filtros de áudio com os SDKs nativos de chamada.
Os efeitos de áudio dos Serviços de Comunicação do Azure oferecem filtros que podem melhorar sua chamada de áudio. Para plataformas nativas (Android, iOS ou Windows) você pode configurar os seguintes filtros:
Cancelamento de eco
Ele elimina o eco acústico causado pela voz do chamador ecoando de volta para o microfone depois de ser emitida pelo alto-falante, garantindo uma comunicação clara.
Você pode configurar o filtro antes e durante uma chamada. Só pode alternar o cancelamento de eco se o modo de música estiver ativado. Por padrão, esse filtro está habilitado.
Supressão de ruído
Melhore a qualidade do áudio filtrando ruídos de fundo indesejados, como digitação, ar condicionado ou sons de rua. Esta tecnologia garante que a voz é nítida e clara, facilitando uma comunicação mais eficaz.
Você pode configurar o filtro antes e durante uma chamada. Os modos atualmente disponíveis são Off
, Auto
, Low
, e High
. Por padrão, esse recurso é definido como High
modo.
Controle automático de ganho (AGC)
Ajusta automaticamente o volume do microfone para garantir níveis de áudio consistentes durante toda a chamada.
- O controle de ganho automático analógico é um filtro disponível apenas antes de uma chamada. Por padrão, esse filtro está habilitado.
- O controle de ganho automático digital é um filtro disponível apenas antes de uma chamada. Por padrão, esse filtro está habilitado.
Modo Música
O modo de música é um filtro disponível antes e durante uma chamada. Saiba mais sobre o modo de música aqui. O modo de música só funciona em plataformas nativas sobre 1n1 ou chamadas em grupo e não funciona em chamadas 1:1 entre nativos e web. Por padrão, o modo de música está desativado.
Pré-requisitos
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente
- Um recurso de Serviços de Comunicação implantado. Criar um recurso de Serviços de Comunicação
- Um token de acesso de usuário para habilitar o cliente chamador. Para obter mais informações, consulte Criar e gerenciar tokens de acesso.
- Opcional: conclua o início rápido para adicionar chamadas de voz ao seu aplicativo
Configure o seu sistema
Criar o projeto do Visual Studio
Para um aplicativo UWP, no Visual Studio 2022, crie um novo projeto Aplicativo em Branco (Universal Windows ). Depois de inserir o nome do projeto, sinta-se à vontade para escolher qualquer SDK do Windows posterior a 10.0.17763.0.
Para um aplicativo WinUI 3, crie um novo projeto com o modelo Aplicativo em branco, empacotado (WinUI 3 na área de trabalho) para configurar um aplicativo WinUI 3 de página única. É necessário o SDK de Aplicativos Windows versão 1.3 ou posterior.
Instalar o pacote e as dependências usando o Gerenciador de Pacotes NuGet
As APIs e bibliotecas do SDK de chamada estão disponíveis publicamente por meio de um pacote NuGet.
As etapas a seguir exemplificam como localizar, baixar e instalar o pacote NuGet do SDK de chamada:
- Abra o Gerenciador de Pacotes NuGet selecionando Ferramentas>Gerenciador>de Pacotes NuGet Gerenciar Pacotes NuGet para Solução.
- Selecione Procurar e, em seguida, introduza
Azure.Communication.Calling.WindowsClient
na caixa de pesquisa. - Verifique se a caixa de seleção Incluir pré-lançamento está marcada.
- Selecione o
Azure.Communication.Calling.WindowsClient
pacote e, em seguida, selecioneAzure.Communication.Calling.WindowsClient
1.4.0-beta.1 ou uma versão mais recente. - Marque a caixa de seleção que corresponde ao projeto dos Serviços de Comunicação na guia do lado direito.
- Selecione o botão Instalar .
O recurso de filtro de áudio permite que você aplique pré-processamento de áudio diferente ao áudio de saída. Existem dois tipos de filtros de áudio: OutgoingAudioFilters
e LiveOutgoingAudioFilters
. Use OutgoingAudioFilters
para alterar as configurações antes do início da chamada e LiveOutgoingAudioFilters
para alterar as configurações enquanto uma chamada está em andamento.
Primeiro, você precisa importar o SDK de chamada:
using Azure.Communication;
using Azure.Communication.Calling.WindowsClient;
Antes do início da chamada
OutgoingAudioFilters
pode ser aplicado quando uma chamada é iniciada.
Comece criando um OutgoingAudioFilters
e passando-o para OutgoingAudioOptions conforme mostrado no código a seguir:
var outgoingAudioOptions = new OutgoingAudioOptions();
var filters = new OutgoingAudioFilters()
{
AnalogAutomaticGainControlEnabled = true,
DigitalAutomaticGainControlEnabled = true,
MusicModeEnabled = true,
AcousticEchoCancellationEnabled = true,
NoiseSuppressionMode = NoiseSuppressionMode.High
};
outgoingAudioOptions.Filters = filters;
Durante a chamada
Você pode aplicar LiveOutgoingAudioFilters
depois que uma chamada começa Você pode recuperar esse objeto do objeto de chamada assim que a chamada começar. Para alterar a configuração no LiveOutgoingAudioFilters
, defina os membros dentro da classe para um valor válido e eles serão aplicados.
Apenas um subconjunto dos filtros disponíveis estão disponíveis durante uma chamada ativa: modo de música, cancelamento de eco e modo de supressão de OutgoingAudioFilters
ruído.
LiveOutgoingAudioFilters filter = call.LiveOutgoingAudioFilters;
filter.MusicModeEnabled = true;
filter.AcousticEchoCancellationEnabled = true;
filter.NoiseSuppressionMode = NoiseSuppressionMode.Auto;