Благодаря языковым стандартам Business Messages и интеллектуальному автоматизированному переводу Google Translate вы можете расширить возможности своего агента, общаясь с пользователями на предпочитаемом ими языке. В этом руководстве вы узнаете, как проверить концепцию интеграции Google Translate с веб-перехватчиком Business Messages.
Что вам понадобится
Для начала вам нужно подготовить следующие вещи:
- Полная и одобренная регистрация партнера в Business Messages. См. «Регистр как руководство для партнеров» .
- Агент Business Messages, включая ключ вашей учетной записи службы. Чтобы создать агента, см. руководство «Создание первого агента» .
- Компьютер с установленным Google Cloud SDK и Node.js (версия 10 или выше). Убедитесь, что вы вошли в систему и установили активный идентификатор проекта в Google Cloud SDK.
- Устройство Android или iOS для тестирования.
Получить код
В этом руководстве вы познакомитесь с примером кода веб-перехватчика, который интегрируется с Google Translate. Чтобы получить код, клонируйте репозиторий с Github:
git clone https://github.com/google-business-communications/bm-nodejs-translation-tutorial
Перейдите в клонированный каталог и поместите ключ своей сервисной учетной записи в каталог ресурсов:
cp credentials.json bm-nodejs-translation-sample/resources/bm-agent-service-account-credentials.json
СОВЕТ. Если вам нужна помощь в настройке или загрузке сервисного ключа, см. руководство Google Cloud по управлению сервисными учетными записями .
Как только это будет сделано, вы можете развернуть код:
gcloud app deploy
Используя мобильное устройство, отправьте несколько сообщений агенту. Попробуйте отправлять сообщения на разных языках и посмотрите, что произойдет.
Настройте API-интерфейс Переводчика
Пример кода поставляется с уже установленным пакетом Node для Translate API. Если вас интересует, как установить пакет Node или API Translate на другом языке программирования, см. документацию API Cloud Translate .
Чтобы использовать Translate API, вам необходимо импортировать библиотеку и создать клиент Translate API. Откройте файл routes/index.js
. Соответствующие строки:
// Import the Translate API library.
const { Translate } = require("@google-cloud/translate").v2;
// Create a new Translate API client.
const translate = new Translate();
С этого момента вы можете получить доступ к методам Translate API объекта перевода.
Взгляните на переменные, созданные в верхней части файла:
const SERVER_LANGUAGE = "en";
let currentLanguage = SERVER_LANGUAGE;
В примере кода язык сервера сохраняется как константа, поскольку он относительно фиксирован. Однако текущий язык разговора может измениться, поэтому он отслеживается в переменной currentLanguage
.
Определение входящего языка
Пример кода определяет, изменился ли входящий язык, и если да, то предлагает пользователю выбрать язык, который он хочет использовать в разговоре. Попробуйте эту функцию на своем мобильном устройстве, набрав сообщение агенту не на английском языке. Если вы не знаете других языков, попробуйте ввести «Hola» (по-испански «Привет»!).
Агент отвечает запросом, спрашивает, хочет ли пользователь переключить язык. В приглашении содержатся предлагаемые ответы, по которым пользователь может щелкнуть, чтобы переключиться на этот язык.
Давайте сначала взглянем на функцию определения языка.
/**
* Detects input text language.
*
* @param {string} text The text received from the consumer.
* @param {Context} context The user message request context.
* @return A Promise with the detected language code.
*/
async function detectLanguage(text, context) {
return new Promise(function (resolve, reject) {
translate
.detect(text)
.then((result) => {
if (result && result.length > 0) {
if (result[0].confidence > CONFIDENCE_THRESHOLD) {
resolve(result[0].language);
}
resolve(bcp47.parse(context.resolvedLocale).language);
} else {
reject("No language detected");
}
})
.catch((err) => {
console.error("ERROR:", err);
reject(err);
});
});
}
Этот метод использует метод обнаружения клиента перевода. Поскольку API-интерфейс Translate может обнаруживать несколько языков с разной степенью достоверности (а также потому, что он поддерживает несколько входных данных), этот метод возвращает массив результатов. В выборку берется первый результат, который является результатом с наибольшей достоверностью.
Использование разрешенной локали
Иногда API-интерфейс Translate не может с высокой степенью достоверности определить язык сообщения. Например, если ваша кошка пробегает по вашей клавиатуре и вводит бессмысленную строку, API-интерфейс Translate все равно пытается определить язык, но обнаруженный язык, вероятно, неправильный. (В конце концов, Google Translate пока не поддерживает кошачьи языки!) API Translate указывает на это, устанавливая низкое значение достоверности в результате translate.detect
.
В этом сценарии пример кода возвращается к языку в разрешенной локали Business Messages , что является лучшим предположением API Business Messages о языке на основе контекста сообщения. Поскольку разрешенный языковой стандарт имеет формат BCP-47, вы можете использовать соответствующий пакет Node.js для анализа кода языка на основе языкового стандарта.
Вы можете проверить это поведение, набрав агенту длинную строку тарабарщины. В большинстве случаев вы не должны видеть предложение изменить язык (если только разрешенная локаль не отличается от текущего языка). Агент просто говорит, что не понимает вашего запроса.
Предлагает сменить язык
Обнаружив, что язык изменился, агент отправляет обратно запрос на изменение языка.
if (detectedLanguage != currentLanguage) {
translateText(
"Which language would you like to use?",
SERVER_LANGUAGE,
currentLanguage
).then((normalizedTranslationNotice) => {
sendResponse(
normalizedTranslationNotice,
conversationId,
[
...new Set([detectedLanguage, currentLanguage, SERVER_LANGUAGE]),
].map((x) => createSuggestedReply(x))
);
});
}
Код создает приглашение, переводит его на текущий язык (подробнее об этом см. в разделе «Перевод исходящих сообщений»), а затем отправляет ответ с предлагаемыми ответами. Пользователь может захотеть говорить на любом из следующих языков:
- Обнаруженный входящий язык.
- Текущий язык разговора.
- Встроенный язык сервера.
Поскольку эти три языка могут перекрываться (например, если текущий язык уже является языком сервера), сервер использует объект set для удаления дубликатов. Затем он создает предлагаемый ответ для каждого языка:
/**
* Create a suggested reply for a language code.
* @param {string} languageCode A ISO 6391 language code.
* @return {Suggestion} The suggestion object for switching to the language.
*/
function createSuggestedReply(languageCode) {
return {
reply: {
text: ISO6391.getNativeName(languageCode),
postbackData: SWITCH_LANGUAGE_POSTBACK + languageCode,
},
};
}
В предлагаемом ответе название языка отображается на его родном языке. Например, испанский язык отображается как «Español». Чтобы получить информацию о языке по его двухзначному коду языка, вы можете использовать библиотеку ISO-639-1 для Node.js.
Обратите внимание на данные обратной передачи, которые отправляются на сервер, когда пользователь нажимает на это предложение. Данные обратной передачи сообщают серверу, как реагировать, и предоставляют контекст предложения.
Метод sendResponse
присоединяет к ответу эти объекты предложения :
let messageObject = {
…
suggestions: suggestedReplies,
};
Изменение языка разговора
Теперь вернитесь на свое мобильное устройство и попробуйте выбрать новый язык в появившейся ранее подсказке. Например, если вы набрали «Hola», попробуйте нажать «Español» в предлагаемых ответах.
Агент отвечает на новом языке. О том, как переводить исходящие ответы, мы расскажем позже. А пока посмотрите на код, который получает и обрабатывает предлагаемый ответ, по которому вы щелкнули.
if (requestBody.suggestionResponse !== undefined) {
let postbackData = requestBody.suggestionResponse.postbackData;
if (postbackData.startsWith(SWITCH_LANGUAGE_POSTBACK)) {
let languageCode = postbackData.substr(SWITCH_LANGUAGE_POSTBACK.length);
currentLanguage = languageCode;
translateText(
"The language was set to " +
ISO6391.getName(languageCode) +
". Please repeat your request.",
SERVER_LANGUAGE,
languageCode
).then((translationNotice) => {
sendResponse(translationNotice, conversationId, []);
});
}
}
Если запрос содержит ответ на предложение, сервер использует данные обратной передачи, чтобы определить, что делать. В этом простом случае сервер поддерживает только один тип данных обратной передачи — SWITCH_LANGUAGE_POSTBACK, что означает, что диалог должен перейти на язык в следующем языковом коде. После анализа этого языкового кода сервер отправляет сообщение, уведомляющее пользователя о том, что язык изменился.
Перевод входящих сообщений
Теперь, когда язык изменен, вы можете отправить запрос агенту на этом языке на своем мобильном устройстве. Попробуйте отправить слово «помощь» на новом языке. Если вы изменили язык на испанский, введите «ayuda» и отправьте сообщение.
Сервер понимает ваш запрос о помощи и отвечает меню опций. Попробуйте любой из них, чтобы увидеть жестко запрограммированный образец ответа.
В примере кода используется метод translateText
для перевода как входящих, так и исходящих сообщений. Взгляните на это сейчас:
/**
* Translates text to a given target language. No translation if source and
* target language match.
*
* @param {string} text the text to translate
* @param {string} sourceLanguage The language of the source text.
* @param {string} targetLanguage The target language.
* @return A Promise with the translated text.
*/
async function translateText(text, sourceLanguage, targetLanguage) {
if (sourceLanguage === targetLanguage) {
return new Promise(function (resolve, reject) {
resolve(text);
});
}
return new Promise(function (resolve, reject) {
translate
.translate(text, targetLanguage)
.then((result) => {
if (result && result.length > 0) {
resolve(result[0]);
} else {
reject("Could not translate message");
}
})
.catch((err) => {
console.error("ERROR:", err);
reject(err);
});
});
}
Если исходный язык совпадает с целевым языком, делать нечего. В противном случае сервер вызывает метод перевода в клиенте Translate API. Как и метод обнаружения, метод перевода может принимать несколько входных данных. Поскольку сервер предоставляет только один вход, он принимает первый результат от API-интерфейса Translate.
Посмотрите на раздел метода обратного вызова, который отвечает на входящие сообщения на текущем языке:
translateText(incomingMessage, currentLanguage, SERVER_LANGUAGE).then(
(normalizedMessage) => {
let serverResponse = chooseResponseMessage(normalizedMessage);
…
}
);
Сервер использует выходные данные translateText
для выбора ответного сообщения. В следующем разделе мы углубимся в процесс выбора ответного сообщения и его перевода.
Перевод исходящих сообщений
После того, как сервер переведет ваше входящее сообщение на родной английский, он должен выбрать, перевести и отправить соответствующий ответ на запрос пользователя. В примере кода используется очень простая схема, которая сопоставляет ключевые слова с ответами. Взгляните на метод chooseResponseMessage
.
/**
* Select a topically appropriate response based on the message
* content that the user sent to the agent.
*
* @param {string} incomingMessage The content of the message that the user typed in.
* @param {string} conversationId The unique id for this user and agent.
* @return {string} A response message.
*/
function chooseResponseMessage(incomingMessage) {
let responseMapping = {
balance: "Your current balance is $500.",
deposit: "Please enter your deposit amount.",
transfer:
"Please enter the account number where you wish to transfer the funds.",
withdraw: "Please enter the amount you wish to withdraw.",
help: "Please choose what you'd like to do: balance, deposit, transfer, or withdraw.",
};
for (const [key, value] of Object.entries(responseMapping)) {
if (incomingMessage.toLowerCase().includes(key)) {
return value;
}
}
return "I didn't understand your request. Please try again.";
}
Эта схема поддерживает на сервере только английский язык, а это означает, что сервер должен переводить все входящие и исходящие сообщения. Более сложная система может поддерживать несколько языков и естественным образом отвечать на запросы на других языках. Например, если ваш агент поддерживает испанский язык, возможно, у него уже есть ключ «ayuda» в карте ответов. Более сложные системы могут также полагаться на другие методологии выбора подходящего ответа, такие как ML или алгоритмы оценки. Одним из способов создания более интеллектуальных ответов с помощью Business Messages является интеграция с Dialogflow.
Теперь посмотрите на код, который отправляет выбранное сообщение обратно пользователю.
let serverResponse = chooseResponseMessage(normalizedMessage);
translateText(
serverResponse,
SERVER_LANGUAGE,
currentLanguage
).then((normalizedResponse) => {
sendResponse(normalizedResponse, conversationId, []);
});
В примере кода повторно используется метод translateText
для перевода выбранного ответа на текущий язык разговора. Затем метод sendResponse
создает новый объект Message и отправляет его пользователю.
Краткое содержание
Из этого руководства вы узнали, как создать простую интеграцию с API Cloud Translate и использовать региональные функции Business Messages, чтобы охватить больше пользователей. Если хотите, вы можете использовать пример кода из этого руководства в качестве отправной точки для собственной интеграции или попробовать что-то новое! Вот несколько идей:
- Отправляйте двуязычные сообщения, содержащие как исходное содержимое сообщения, так и автоматически переведенный контент.
- Предоставьте пользователю полное меню поддерживаемых языков, когда он начнет разговор.
- Используйте расширенные функции Translate API, такие как глоссарии, для надежного перевода слов, специфичных для вашего бизнеса.
Благодаря интеграции с API-интерфейсами Translate вы можете использовать высококачественный машинный перевод, чтобы общаться с большим количеством пользователей на их наиболее удобном языке. Ваш агент может вести более продуктивные и эффективные переговоры, повышая удовлетворенность клиентов и выполнение задач.