A KFC abre anualmente cerca de 100 restaurantes em toda a Rússia, que exigem funcionários. Muitos também escolhem os restaurantes da rede como locais de empregos temporários, por exemplo, estudantes. KFC recebe mais de 15.000 pedidos de emprego todos os meses . Por um lado, bem, a empresa não ficará sem funcionários, mas, por outro lado, você pode imaginar quantos gerentes de RH serão necessários para processar todos esses candidatos?
Além disso, a maioria dessas respostas contém erros e algumas são irrelevantes para a vaga. E, embora os RH gastem seu tempo com eles, perdem candidatos realmente valiosos. Como voce pode evitar isso?
Para melhorar o processo de recrutamento, a KFC fez parceria com a Voximplant . A empresa propôs a seguinte ideia: o robô liga para todos os candidatos, pergunta a relevância da vaga e, em caso de resposta positiva, fala mais sobre a vaga e se conecta ao call center.
Os resultados superaram todas as expectativas. O robô processa respostas 10 vezes mais rápido do que um humano, eliminando 37% dos candidatos, e os gerentes de RH só se comunicam com os candidatos interessados, aumentando assim a conversão.
Vamos ver como isso funciona
Fazer tal robô na plataforma Voximplant é muito mais fácil do que parece. Vamos escrever um robô semelhante agora.
, . , , , , -.
Voximplant, . , :
require(Modules.ASR);
require(Modules.Player);
const callerid = '7xxxxxxxxxx';
const operator = '7xxxxxxxxxx';
let data;
let callCandidate, callOperator;
let asr;
, , VoxEngine.customData. JSON : { "phone" : "7xxxxxxxxxx", "name": "" }.
, JSON customData, callerid data.phone :
VoxEngine.addEventListener( AppEvents.Started, async e => {
data = JSON.parse( VoxEngine.customData() );
// callerid data.phone
callCandidate = VoxEngine.callPSTN( data.phone, callerid );
//
callCandidate.addEventListener( CallEvents.Connected, callCandidate_connected_handler );
callCandidate.addEventListener( CallEvents.Disconnected, callCandidate_disconnected_handler );
callCandidate.addEventListener( CallEvents.Failed, callCandidate_failed_handler );
});
, , ( ) . , , :
function callCandidate_connected_handler( e ) {
//
const text = ` ${data.name}. ?`;
const language = VoiceList.Yandex.Neural.ru_RU_alena;
const player = VoxEngine.createTTSPlayer( text, language );
// ,
// ,
player.sendMediaTo( callCandidate );
player.addEventListener( PlayerEvents.PlaybackFinished, playbackFinishedHandler );
};
, . , , :
function playbackFinishedHandler() {
// ASR
const asrProfile = ASRProfileList.Tinkoff.ru_RU;
asr = VoxEngine.createASR( { profile: asrProfile } );
// ,
// ,
callCandidate.sendMediaTo( asr );
asr.addEventListener( ASREvents.Result, asrResultHandler );
}
. . , “”, , , . , , :)
“”, . :
async function asrResultHandler( answer ) {
//
asr.removeEventListener( ASREvents.Result );
// text,
if( answer.text.includes( '' ) ) {
//
data.wantsToWork = '';
// ( callCandidate_disconnected_handler )
callCandidate.hangup();
}
else if ( answer.text.includes( '' ) ) {
data.wantsToWork = '';
//
startOperatorCall();
}
else {
callCandidate.hangup();
}
}
function startOperatorCall() {
const callOperator = VoxEngine.callPSTN( operator, callerid );
//
VoxEngine.sendMediaBetween( callCandidate, callOperator );
//
callOperator.addEventListener( CallEvents.Connected, () => {
Logger.write( ' ' );
});
callOperator.addEventListener( CallEvents.Disconnected, async () => {
callCandidate.hangup();
});
callOperator.addEventListener( CallEvents.Failed, async () => {
callCandidate.hangup();
});
}
. ( ) http- . :
//
async function callCandidate_disconnected_handler( e ) {
const url = 'https://servicename';
// url
await Net.httpRequestAsync( url, { method: 'POST', postData: JSON.stringify(data) } );
//
VoxEngine.terminate();
};
//
function callCandidate_failed_handler( e ) {
VoxEngine.terminate();
};
. , , , , , -.
. , ; . — :)
!