Javascript SDK
Visão geral
O skd em javascript é um cliente leve para interagir com a api Speaqr em tempo real. Permite ao programador aceder aos métodos da API, fornecendo determinadas funcionalidades. É compatível com os ambientes browser e Node.jsO pacote é publicado no npm.Para utilizar o SDK , necessita de uma chave API válida. Para a obter, contacte-nos através do formulário de encomenda.Instalação
Através do npm
npm install @speaqr/javascript-sdk
Via cdn
<script src="https://unpkg.com/@speaqr/javascript-sdk@latest/dist/sdk.min.js"></script>
Descarregar os ficheiros
sdk.jssdk.min.js
Instanciar a classe
O Speaqr SDK pode ser instanciado e utilizado numa variedade de ambientes, como navegadores, Node.js e módulos importados de uma CDN. De seguida, explicamos as diferentes formas de o inicializar em função do ambiente.No pacote npm, existem exemplos específicos de idiomas na pasta:dist/examples/howInstantiateSdk
Navegadores (utilizando CDN)
O SDK está disponível através de uma CDN para ser utilizado diretamente no browser, sem necessidade de instalação prévia.
<html>
<script src="https://unpkg.com/@speaqr/javascript-sdk@latest/dist/sdk.min.js"></script>
<script src="https://my_code.js"></script>
</html>
// my_code.js
const sdk = new SpeaqrSDK({
apiKey: "YOUR_API_KEY",
showLogs: true
});
Node.js
Num ambiente Node.js, podes instalar o SDK através do npm e importá-lo com require ou import, dependendo da tua configuração.
// Using CommonJS (require)
const SpeaqrSDK = require("@speaqr/javascript-sdk");
const sdk = new SpeaqrSDK({
apiKey: "YOUR_API_KEY",
showLogs: true
});
TypeScript
Se trabalhar num ambiente TypeScript, o SDK inclui definições de tipos(index.d.ts)
que facilitam a utilização do SDK com tipagem forte.
import { SpeaqrSDK } from "@speaqr/javascript-sdk";
const sdk = new SpeaqrSDK({
apiKey: "YOUR_API_KEY",
showLogs: true
});
Ambientes do módulo ES (ESM)
Se estiver a trabalhar num ambiente que suporte módulos ES, como os browsers modernos ou um ambiente de desenvolvimento com suporte ESM, pode utilizar a importação .
import SpeaqrSDK from "https://unpkg.com/@speaqr/javascript-sdk@latest/dist/sdk.min.js";
const sdk = new SpeaqrSDK({
apiKey: "YOUR_API_KEY",
showLogs: true
});
RequireJS
O SDK é compatível com sistemas de carregamento como o RequireJS.
<html>
<script data-main="app" src="https://requirejs.org/docs/release/2.3.6/minified/require.js"></script>
<script src="https://my_code.js"></script>
</html>
// my_code.js
require(["https://unpkg.com/@speaqr/javascript-sdk@latest/dist/sdk.min.js"],
function(SpeaqrSDK) {
const sdk = new SpeaqrSDK({
apiKey: "YOUR_API_KEY",
showLogs: true
});
Construção e destruição
A classeSpeaqrSDK
inclui duas formas de instanciação: um construtor síncrono e um método de criação
estático assíncrono. Além disso, fornece um método destroy()
para libertar recursos quando a instância do SDK já não é necessária.Construtor síncrono
Este construtor cria imediatamente uma instância do SDK. Requer que a chave da API seja fornecida, mas não efectua a validação na inicialização.Parâmetros
Exemplo
const sdk = new SpeaqrSDK({
apiKey: "YOUR_API_KEY",
showLogs: true
});
Construtor assíncrono
Este método estático devolve uma promessa que resolve uma instância do SDK, validando a chave da API antes de concluir a inicialização.Parâmetros
Exemplo
try {
const sdk = await SpeaqrSDK.create({
apiKey: "YOUR_API_KEY",
showLogs: true
});
console.log("SDK initialized:", sdk);
} catch (error) {
console.error("Error initializing SDK:", error);
}
Método destroy()
(libertação de recursos)
O SDK fornece o método destroy() para libertar recursos quando a instância já não é necessária. O método é assíncrono e devolve uma promessa. Este método:- Fecha as ligações de socket activas.
- Remover os ouvintes dos eventos registados.
- Liberta referências internas para evitar fugas de memória.
- Substitui todos os métodos SDK para evitar utilizações não intencionais após a destruição.
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
// SDK use
sdk.languages()
.then((languages) => console.log("Supported languages:", languages))
.catch((error) => console.error(error));
//When the SDK is no longer needed
await sdk.destroy();
Se tentar chamar um método depois de a instância ter sido destruída, será lançado um erro:
sdk.languages(); // Error: Method "languages" cannot be called after the SDK instance has been destroyed.
Propriedades
A classe SpeaqrSDK contém várias propriedades acessíveis que permitem configurar e obter informações sobre o estado do SDK.apiKey
Armazena a chave api utilizada para autenticar os pedidos à api Speaqr.Acesso
get apiKey(): string;
set apiKey(apiKey: string);
Exemplo
// Get the current API key
console.log("Current API key:", sdk.apiKey);
// Set a new API key
sdk.apiKey = "NEW_API_KEY";
logs
Indica se os registos do SDK estão activados na consola.Acesso
get logs(): boolean;
set logs(show: boolean);
Exemplo
// Enable logs
sdk.logs = true;
// Check if logs are enabled
console.log("Logs enabled:", sdk.logs);
socketOpened
Indica se a ligação do socket está aberta.Acesso
get socketOpened(): boolean;
Exemplo
// Check if the socket connection is open
if (sdk.socketOpened) {
console.log("Socket is currently open.");
} else {
console.log("Socket is closed.");
}
Métodos
O SDK fornece vários métodos para interagir com a api Speaqr em lote. As suas utilizações e configurações são descritas em seguida.languajes
Obtém a lista de idiomas suportados pelo SDK para transcrição, tradução e síntese de voz.Sintaxe
languages(): Promise<{
id: string;
name: string;
}[]>;
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
// Fetch the list of supported languages
sdk.languages()
.then((languages) => {
console.log("Supported languages:", languages);
})
.catch((error) => {
console.error("Error fetching languages:", error);
});
Resposta
Este método devolve uma promessa que resolve um conjunto de objectos, em que cada objeto representa um idioma suportado. O id do idioma será devolvido em ISO3 e o nome do idioma em inglês.
voices
Obtém a lista de vozes disponíveis para a síntese de voz (TTS) numa língua. Opcionalmente, o resultado pode ser filtrado por género de voz, modo de resposta e/ou motor de voz.Desta forma, é possível descobrir se uma configuração de língua, género, modo de resposta e motor pode ser realizada, uma vez que não existem vozes para todas as combinações.Sintaxe
voices(
language: string,
mode?: 'block' | 'streaming',
voiceGender?: 'F' | 'M',
voiceEngine?: Array<'standard' | 'neural' | 'generative'>
): Promise<{
uuid: string;
language: string;
gender: VoiceGender;
engines: Array<'standard' | 'neural' | 'generative'>;
modes: Array<'block' | 'streaming'>;
}[]>;
Parâmetros
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
// Fetch the list of available voices for English (UK) with a block mode
sdk.voices('en-gb', 'block')
.then( (response) => {
divResponse.innerText = JSON.stringify(response, null, 4);
})
.catch( (err) => {
alert('An error occurred while requesting available voices.');
});
Resposta
file
Processa um Blob contendo uma forma de onda de áudio e executa a operação especificada emmode
. O resultado dependerá do modo selecionado e será devolvido numa promessa.Sintaxe
file(params: {
mode?: 'sts' | 'stt' | 'stt+translation';
languageIdSource?: string;
languageIdTarget?: string;
voiceGender?: 'F' | 'M';
file: Blob;
}): Promise<{
transcription: string
languageIdSource: string
translation?: string
languageIdTarget?: string
file?: {
type: string
data: ArrayBuffer
}
}>;
Parâmetros
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
// Process an audio file with speech-to-text and translation
sdk.file({
mode: "stt+translation",
file: audioBlob,
languageIdTarget: "en-us"
})
.then((result) => {
console.log("Processing result:", result);
})
.catch((error) => {
console.error("Error processing file:", error);
});
Resposta
O resultado do ficheiro
dependerá do modo
utilizado. Uma resposta com mode=sts
conteria todos os campos. O campo file.data
é um ArrayBuffer
em formato mp3.
Erros
Comunicação com sockets
O Speaqr SDK permite a comunicação em tempo real através de sockets. Estes métodos permitem enviar e receber dados de áudio e de texto sem esperar por uma resposta de bloqueio, melhorando a latência e optimizando a interação com a API.Fluxo de utilização
A utilização de sockets no SDK segue o seguinte fluxo:- Inicializar a configuração da sessão com
socketsInstance
. - Configurar a escuta de respostas com
socketsAddListener
. - Abrir a ligação com
socketsOpen
. - Enviar dados através de
socketSendText
ousocketsSendStream
. - Feche a ligação quando esta já não for necessária com
socketsClose
.
Manuseamento de Socket.IO
O Speaqr SDK utiliza o Socket.IO para a comunicação em tempo real. Para garantir a compatibilidade em todos os ambientes, no caso deo socket.io-client
não estar presente, este trata automaticamente da sua carga da seguinte forma:Deteção de ambiente
Antes de inicializar uma ligação de socket (chamandosocketsInstance
), o SDK verifica o ambiente em que está a ser executado:- Se estiver num navegador, tente carregar
socket.io-client
a partir de um CDN. - Se estiver no Node.js, tente importar
socket.io-client
dos módulos instalados(require("socket.io-client")
). - Se ele não puder carregar o
socket.io-client
, ele lança um erro indicando que ele deve ser instalado manualmente.
#loadSocketIO() {
return new Promise((resolve, reject) => {
//We check if we are in a browser
if (
typeof document !== 'undefined' &&
typeof document.nodeType !== 'undefined' &&
typeof window !== 'undefined' &&
window.document === document &&
document.nodeType === 9
){
//Browser
this.#loadSocketIOBrowser()
.then( resolve )
.catch( reject );
}else{
//We check if we are in Node
if (
typeof process !== 'undefined' &&
typeof process.versions !== 'undefined' &&
typeof process.versions.node !== 'undefined'
){
this.#loadSocketIONode()
.then( resolve )
.catch( reject );
}else{
reject('Socket IO cannot be loaded dynamically. You must instantiate it in your project.');
}
}
});
}
Carregamento dinâmico nos browsers
Se o SDK detecta que está num navegador eio
não está definido, ele carrega socket.io-client
a partir do Socket.IO CDN. Se o socket.io-client
já estiver disponível no navegador, o SDK não o recarrega. A função do SDK que cuida do carregamento é:
// static #SOCKETIO_SRC = 'https://cdn.socket.io/4.8.1/socket.io.min.js';
// static #SOCKETIO_INTEGRITY = 'sha384-mkQ3/7FUtcGyoppY6bz/PORYoGqOl7/aSUMn2ymDOJcapfS6PHqxhRTMh1RR0Q6+';
#loadSocketIOBrowser() {
return new Promise((resolve, reject) => {
if (typeof io!='undefined'){ //If it is already present we do not load it
resolve();
return;
}
const script = document.createElement('script');
script.src = SpeaqrSDK.#SOCKETIO_SRC;
script.integrity = SpeaqrSDK.#SOCKETIO_INTEGRITY;
script.crossOrigin = 'anonymous';
// When the script is loaded successfully
script.onload = () => resolve();
// En caso de error durante la carga
script.onerror = () => reject(new Error(`Failed to load script ${script.src}`));
// We add the script to the document
document.head.appendChild(script);
});
}
Carregamento dinâmico no Node.js
Se o SDK detetar que está num ambiente Node.js e queglobalThis.io
não está definido, tenta importar socket.io-client
diretamente. Se não for possível importar, ele lançará um erro indicando que ele deve ser instalado manualmente. A função que lida com a importação é:
#loadSocketIONode() {
return new Promise((resolve, reject) => {
if (typeof globalThis.io !== 'undefined') {
resolve();
return;
}
try {
const { io } = require('socket.io-client');
globalThis.io = io;
resolve();
} catch (error) {
reject(new Error(`Failed to load socket.io-client on Node. Please install with "npm install socket.io-client". Error: ${error}`));
}
});
}
Para evitar problemas
Se trabalhares com Node.js, instala manualmenteo socket.io-client
. Isso evitará que o SDK falhe se tentar importá-lo e não conseguir encontrá-lo.
npm install socket.io-client
Se estiveres a trabalhar num browser com restrições de rede (firewalls, CSP), certifica-te de que o teu ambiente te permite carregar scripts a partir de https://cdn.socket.io/.
Caso contrário, instala o socket.io-client
manualmente no teu projeto e carrega-o antes de inicializar o SDK.socketsInstance
Configura uma instância de sockets para comunicação em tempo real com a API. Este método deve ser chamado antes de abrir a conexão comsocketsOpen()
. Retorna uma promessa que é resolvida quando o Socket.io
é instanciado.Consoante a funcionalidade pretendida, será escolhido o espaço combres, stt, tradutor, tts ou sts adequado.Sintaxe
socketsInstance(
namespace: 'stt' | 'translator' | 'tts' | 'sts',
params: 'STTSocketParams' | 'TranslatorSocketParams' | 'TTSSocketParams' | 'STSSocketParams'
): Promise<void>;
STT
Parâmetros
Exemplo
Configure uma sessão de tomada em tempo real para transcrever áudio.
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance("stt", {
languageIdSource: "en-us",
sendAudio: {
broadcastVia: "chunk"
}
});
TRANSLATOR
Parâmetros
Exemplo
Configurar uma sessão de socket em tempo real para tradução.
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance("translator", {
languageIdSource: "en-us",
languageIdTarget: "es-es",
});
TTS
Parâmetros
Exemplo
Configurar uma sessão de tomada em tempo real para sintetizar áudio a partir de texto.
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance("tts", {
languageIdTarget: "en-us",
receiveAudio: {
obtainVia: "chunk"
}
});
STS
Parâmetros
Exemplo
Configurar uma sessão de tomada de voz
em tempo real.
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance("sts", {
languageIdSource: "en-us",
languageIdTarget: "en-us",
sendAudio: {
broadcastVia: "chunk"
},
receiveAudio: {
obtainVia: "chunk"
}
});
socketsOpen
Abre a ligação de socket previamente configurada comsocketsInstance()
. A falha em chamar socketsInstance
resultará em um erro. Este método devolve uma promessa que resolve para um booleano, ou o url para receber o fluxo de áudio se receiveAudio.obtainVia = url
.Sintaxe
socketsOpen(): Promise<boolean | string>;
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance("sts", {
languageIdSource: "en-us",
languageIdTarget: "en-us",
sendAudio: {
broadcastVia: "chunk"
},
receiveAudio: {
obtainVia: "chunk"
}
})
.then( () => {
//We establish the connection with the sockets
sdk.socketsOpen()
.then( (response) => {
//Open sockets
console.log(response);
})
.catch( (err) => {
console.error('An error occurred while connecting to the sockets.', err);
});
})
.catch( (err) => {
console.error('An error occurred while instantiating to the sockets.', err);
});
socketsClose
Devolve uma promessa que é resolvida quando a ligação de socket estabelecida comsocketsOpen
é fechada. A não chamada de socketsInstance
resultará num erro. Se socketsOpen
não tiver sido chamado, este método não executa qualquer ação e continua a resolver a promessa.Sintaxe
socketsClose(): Promise<void>;
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance("sts", {
languageIdSource: "en-us",
languageIdTarget: "en-us",
sendAudio: {
broadcastVia: "chunk"
},
receiveAudio: {
obtainVia: "chunk"
}
})
.then( () => {
//We establish the connection with the sockets
sdk.socketsOpen()
.then( (response) => {
//Open sockets
console.log(response);
// We close the sockets
sdk.socketsClose()
.then( () => {
console.log('sockets are closed');
})
.catch( (err) => {
console.error('There was an error closing the sockets.', err);
});
})
.catch( (err) => {
console.error('An error occurred while connecting to the sockets.', err);
});
})
.catch( (err) => {
console.error('An error occurred while instantiating to the sockets.', err);
});
socketsAddListener
Subscreve um ouvinte para um evento específico da ligação de socket. Isto permite receber dados em tempo real. A não chamada desocketsInstance
resultará num erro.Sintaxe
socketsAddListener(
eventType: 'connected' | 'start' | 'error' | 'result' | 'endSynth',
listener: (data: any) => void
): void;
Parâmetros
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance("sts", {
languageIdSource: "en-us",
languageIdTarget: "en-us",
sendAudio: {
broadcastVia: "chunk"
},
receiveAudio: {
obtainVia: "chunk"
}
})
.then( () => {
// We subscribe to events
sdk.socketsAddListener('result', (data) => {
console.log(data);
});
sdk.socketsAddListener('error', (error) => {
console.error(error);
});
//We establish the connection with the sockets
sdk.socketsOpen()
.then( (response) => {
//Open sockets
console.log(response);
// We close the sockets
sdk.socketsClose()
.then( () => {
console.log('sockets are closed');
})
.catch( (err) => {
console.error('There was an error closing the sockets.', err);
});
})
.catch( (err) => {
console.error('An error occurred while connecting to the sockets.', err);
});
})
.catch( (err) => {
console.error('An error occurred while instantiating to the sockets.', err);
});
Resposta
Consoante o evento, a resposta obtida será diferente. Para cada uma delas, são apresentadas em pormenor as respostas obtidas.connected
Este evento não devolve o objeto com o qual os sockets foram instanciados.
start
Devolve um booleano ou o url para receber o áudio em fluxo contínuo sereceiveAudio.obtainVia = url
.result
Os campos do objeto a receber dependerão do espaço de nomes com que os sockets foram instanciados. Abaixo está um objeto parasts
que contém todos os campos possíveis.
endSynth
Recebe o texto do qual se terminou a síntese de áudio.
error
Este evento recebe um objeto com diferentes descrições de erros que podem ocorrer, quer devido a erros de programação na instanciação dos modos de utilização, quer nos dados que estão a tentar ser processados. São enumerados os possíveis erros de execução.Erros
disconnect
Recebe uma cadeia de caracteres com o motivo da desconexão. Por exemplo:"io client disconnect" ou "transport close"
socketsRemoveListener
Remove um ouvinte de um evento e função específicos previamente subscritos comsocketAddListener
. Se o socketAddListener
não tiver sido feito para esse tipo de evento e/ou função, será devolvido um erro. A não chamada de socketsInstance
resultará num erro.Sintaxe
socketsRemomveListener(
eventType: 'connected' | 'start' | 'error' | 'result' | 'disconnect',
listener: (data: any) => void
): void;
Parâmetros
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance("sts", {
languageIdSource: "en-us",
languageIdTarget: "en-us",
sendAudio: {
broadcastVia: "chunk"
},
receiveAudio: {
obtainVia: "chunk"
}
})
.then( () => {
// We subscribe to events
sdk.socketsAddListener('result', evt_result);
sdk.socketsAddListener('start', (status) => {
console.log(status);
// Once the connection is established, I unsubscribe from "result"
sdk.socketsRemoveListener('result', evt_result);
});
//We establish the connection with the sockets
sdk.socketsOpen()
.then( (response) => {
//Open sockets
console.log(response);
// We close the sockets
sdk.socketsClose()
.then( () => {
console.log('sockets are closed');
})
.catch( (err) => {
console.error('There was an error closing the sockets.', err);
});
})
.catch( (err) => {
console.error('An error occurred while connecting to the sockets.', err);
});
})
.catch( (err) => {
console.error('An error occurred while instantiating to the sockets.', err);
});
// Function for the "result" event
function evt_result(data){
console.log(data);
}
socketsSendText
Envia um texto para ser processado e devolve uma promessa, que é resolvida com o estado do envio do socket recebido. Se os sockets não estiverem abertos, ocorrerá um erro. Se ocorrer um erro, a mensagem será rejeitada, comunicando o erro.Sintaxe
socketsSendText(text: string): Promise<boolean>;
Parâmetros
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance('translator', {
languageIdSource:'en-gb',
languageIdTarget:'fr-fr',
})
.then( () => {
// We subscribe to events. Here we will receive the translation
sdk.socketsAddListener('result', (data) => {
console.log(data);
});
// We establish the connection with the sockets
sdk.socketsOpen()
.then( (response) => {
//Open sockets
console.log(response);
//I send the text to process
sdk.socketsSendText('Hello, world. How are you today?')
.then( response => console.log('Send status', response))
.catch( respose => console.error('Send status', response));
})
.catch( (err) => {
console.error('An error occurred while connecting to the sockets.', err);
});
})
.catch( (err) => {
console.error('An error occurred while instantiating to the sockets.', err);
});
socketsSendStream
Envia um fragmento de áudio para processamento e devolve uma promessa, que é resolvida pelo estado do envio da tomada recebida. Se os sockets não estiverem abertos, ocorrerá um erro. Se ocorrer um erro, será rejeitado, comunicando o erro.Sintaxe
socketsSendStream(data: ArrayBuffer | Blob): Promise<boolean>;
Parâmetros
Exemplo
const apiKey='xxxxx'; //Your valid apiKey
sdk = await SpeaqrSDK.create({apiKey, showLogs:true});
sdk.socketsInstance("sts", {
languageIdSource: "en-us",
languageIdTarget: "en-us",
sendAudio: {broadcastVia: "chunk"},
receiveAudio: {obtainVia: "chunk", codec: 'mp3', sampleRate: 16000}
})
.then( () => {
//We subscribe to events. Here we will receive the translation
sdk.socketsAddListener('result', result => console.log(result));
sdk.socketsAddListener('start', (status) => {
console.log(status);
// Once the connection is established, I unsubscribe from "result"
sdk.socketsRemoveListener('result', evt_result);
});
//We establish the connection with the sockets
sdk.socketsOpen()
.then(async (response) => {
//Open sockets
console.log(response);
await start();
console.log('Speak now!!!!');
})
.catch( (err) => {
console.error('An error occurred while connecting to the sockets.', err);
});
})
.catch( (err) => {
console.error('An error occurred while instantiating to the sockets.', err);
});
// Start capturing and processing microphone audio
const start = async () => {
navigator.mediaDevices.getUserMedia({ audio: true })
.then(stream => {
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.ondataavailable = ondataavailable;
mediaRecorder.start(500);
})
.catch(error => {
console.error("Error starting recording:", error);
});
}
// Here you receive each audio fragment in a Blob
const ondataavailable = (event) => {
if (!sdk.socketOpened) return;
if (event.data && event.data.size > 0) {
const audioChunk = event.data;
sdk.socketsSendStream(audioChunk);
}
};
Este sítio Web utiliza cookies
Os cookies neste sítio Web são utilizados para personalizar o conteúdo e analisar o tráfego.
Pode encontrar os detalhes destes cookies na secção Política de Privacidade.