Как стать автором
Обновить
68.72
Рейтинг
Voximplant
Облачная платформа голосовой и видеотелефонии

Как KFC добился эффективности в найме большого количества сотрудников

Блог компании Voximplant Разработка систем связи *Бизнес-модели Облачные сервисы Будущее здесь
Tutorial

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() );
  //Начинаем звонок с номера 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();
};

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

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

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

Теги: kfcнаймоптимизацияэкономия временироботыразработка
Хабы: Блог компании Voximplant Разработка систем связи Бизнес-модели Облачные сервисы Будущее здесь
Всего голосов 17: ↑11 и ↓6 +5
Комментарии 16
Комментарии Комментарии 16

Похожие публикации

Лучшие публикации за сутки