KFC ежегодно открывает порядка 100 ресторанов по всей России, в которые требуются сотрудники. Многие также выбирают рестораны сети в качестве места для временной подработки, например, студенты. Ежемесячно в KFC поступает более 15 тысяч откликов на вакансии. С одной стороны, хорошо, компания не останется без работников, но с другой, представляете, какое количество HR-менеджеров потребуется для обработки всех этих кандидатов?

Вдобавок, добрая часть из этих откликов содержит ошибки, а ещё часть нерелевантны для вакансии. И пока HR-ы тратят на них своё время, они упускают действительно стоящих кандидатов. Как же этого избежать?

Чтобы усовершенствовать процесс рекрутинга KFC начал сотрудничать с  Voximplant. Компания предложила следующую идею: робот обзванивает всех кандидатов, спрашивает, насколько актуальна вакансия, а в случае положительного ответа рассказывает подробнее о вакансии и соединяет с колл-центром.

Результаты превзошли все ожидания. Робот обрабатывает отклики в 10 раз быстрее, чем человек, отсеивая 37% кандидатов, а HR-менеджеры общаются только с заинтересованными кандидатами, тем самым повышая конверсию.

Давайте посмотрим, как это работает

Сделать такого робота на платформе Voximplant намного проще, чем кажется. Давайте напишем подобного робота прямо сейчас.

Допустим, на входе мы имеем список имён кандидатов с телефонными номерами. Наша задача позвонить кандидатам по списку, поприветствовать, задать вопрос, хотят ли у нас работать, и в случае ответа перевести на оператора колл-центра.

Идём в панель управления 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() );
  // Start a call from callerid to data.phone
 callCandidate = VoxEngine.callPSTN( data.phone, callerid );

 // Add event listeners
 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 ) {
 // Create a text-to-speech player
 const text = `Здравствуйте ${data.name}. Хотите работать?`;
 const language = VoiceList.Yandex.Neural.ru_RU_alena;
 const player = VoxEngine.createTTSPlayer( text, language );

 // Start playback and connect an event listener after
 player.sendMediaTo( callCandidate );
 player.addEventListener( PlayerEvents.PlaybackFinished, playbackFinishedHandler );
};

Когда воспроизведение заданной нами речи закончится, надо будет обработать голосовой ответ от кандидата. А распознавание речи подключим, например, от Тинькова:

function playbackFinishedHandler() {
 // Create an ASR for speech recognition
 const asrProfile = ASRProfileList.Tinkoff.ru_RU;
 asr = VoxEngine.createASR( { profile: asrProfile } );

 // Wait for the human’s response and add an event listener
 // which will trigger after speech recognition
 callCandidate.sendMediaTo( asr );
 asr.addEventListener( ASREvents.Result, asrResultHandler );
}

Ответ кандидата записан и переведён в текст. Далее надо обработать ответ по нашему усмотрению. Допустим, если ответ от кандидата содержит слово “нет”, то мы запишем информацию о том, что кандидат работать не хочет, и положим трубку. Возможно, у вас будет другая логика, но я описываю простой пример :)

Если же кандидат в своём ответе скажет “да”, то мы запишем эту информацию о кандидате и подключим его к оператору. Выглядеть всё это будет так:

async function asrResultHandler( answer ) {
 // Disable event listener
 asr.removeEventListener( ASREvents.Result );

 // The answer is written into text field
 // we can proceed the result as we want
 if( answer.text.includes( 'no' ) ) {

   // Update the data object
   data.wantsToWork = 'no';

   // Hang up ( Triggers the callCandidate_disconnected_handler )
   callCandidate.hangup();
 }
 else if ( answer.text.includes( 'yes' ) ) {
   data.wantsToWork = 'yes';

   // Call the operator function
   startOperatorCall();
 }
 else {
   callCandidate.hangup();
 }
}

function startOperatorCall() {
 const callOperator = VoxEngine.callPSTN( operator, callerid );

 // Unite two calls into one
 VoxEngine.sendMediaBetween( callCandidate, callOperator );

 // Connect event handler
 callOperator.addEventListener( CallEvents.Connected, () => {
   Logger.write( 'Подключились к оператору' );
 });
 callOperator.addEventListener( CallEvents.Disconnected, async () => {
   callCandidate.hangup();
 });
 callOperator.addEventListener( CallEvents.Failed, async () => {
   callCandidate.hangup();
 });
}

Нам остаётся лишь обработать завершение сессии. При успешном дозвоне мы будем отправлять данные с результатами (хотят ли у нас работать) через http-запрос и завершать сессию. А при ошибке просто завершаем сессию:

// The call was successful
async function callCandidate_disconnected_handler( e ) {
 const url = 'https://servicename';

 // Send the data object via a POST http request to specific url
 await Net.httpRequestAsync( url, { method: 'POST', postData: JSON.stringify(data) } );

 // Terminate session
 VoxEngine.terminate();
};

// The call was not successful
function callCandidate_failed_handler( e ) {
 VoxEngine.terminate();
};

Готово. У нас получился примитивный робот, который обзванивает кандидатов по списку, задаёт им вопрос, записывает ответ обратно в список напротив кандидата и подключает всех, кто дал положительный ответ, к колл-центру.

А дальше всё зависит от вашей фантазии. Можно придумать сложные диалоги и алгоритмы и подключать кандидатов на разные отделы в зависимости от их ответов, можно собирать любую дополнительную информацию в голосовом режиме; а можно просто свести всё до минимума. Как поступить — решаете только вы :)

От себя желаю эффективного бизнеса и прекрасной команды!