Amazon Connectでチャット対応をしていると、どうしてもぶつかるのが「多言語対応」の壁です。
Amazon QなどのAIがAmazon Connectとネイティブに連携されている状況だと対応も早いですが、運用中でAI対応はこれからというケースがまだ多く、オペレーターが慌ててメッセージをコピーして、翻訳サイトにペーストして、結果をまたコピーして貼り付ける。ということが散見されます。
単に手間というだけならまだしも、レスポンスは遅れるし、なにより怖いのがセキュリティです。
「個人情報が含まれているかもしれない会話を、外部の翻訳サイトに貼り付ける」
企業のポリシーとしても避けなければいけない状況です。
そんなリスクや運用負荷から解放されたいということで、Amazon ConnectとLambda、Translateを連携させて、この翻訳作業を「セキュアに完全自動化」しました。
ネイティブにAIが使える状況にするのが一番なので、過渡期の対応として参考になればと手順を書いておきます。
仕組みはシンプルに
やりたいことは単純です。
AWSのサービスだけで完結させて、セキュリティリスクを排除しつつ、リアルタイムで翻訳すること。
アーキテクチャ
- Amazon Connect: チャットの入り口。
- AWS Lambda: 翻訳の仲介。
- Amazon Translate: 翻訳エンジン。
外部ツールを経由せず、データがAWS内だけで完結するのが最大の安心ポイントです。
Translateは驚くほど速いので、翻訳のラグもほとんど気になりません。
作ってみた
1. 翻訳ロジック(Lambda/Python)
まずはConnectから呼び出されて翻訳を実行するLambdaを書きます。
Python(Boto3)だと、拍子抜けするくらい短く書けます。
言語の自動判別(auto)が優秀で、相手が何語で話しかけてきても勝手にターゲット言語(日本語など)にしてくれるのが素晴らしいです。
translate_chat_func.py
import json
import boto3
translate = boto3.client('translate')
def lambda_handler(event, context):
try:
# Connectから渡ってくるパラメータを取得
message = event['Details']['Parameters']['Message']
target_language = event['Details']['Parameters']['TargetLanguageCode'] # 例: 'ja'
# Amazon Translateで翻訳実行
# SourceLanguageCode='auto' にしておけば勝手に判別
response = translate.translate_text(
Text=message,
SourceLanguageCode='auto',
TargetLanguageCode=target_language
)
translated_text = response['TranslatedText']
source_language_used = response['SourceLanguageCode']
# Connectに返す
return {
'translatedText': translated_text,
'sourceLanguage': source_language_used
}
except Exception as e:
print(f"Error during translation: {e}")
# エラー時はとりあえず元のテキストを返す
return {
'translatedText': f"[翻訳エラー] {message}",
'sourceLanguage': 'unknown'
}
2. デプロイはIaCで(CloudFormation)
手動でポチポチ設定するのもいいですがIAMロールの設定ミスは命取り。
ここはCloudFormationで確実に行きます。
template.yaml (抜粋)
Resources:
# 1. Lambda実行用IAMロール
TranslationLambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal: { Service: 'lambda.amazonaws.com' }
Action: 'sts:AssumeRole'
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Policies:
- PolicyName: AmazonTranslateAccessPolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: 'translate:TranslateText' # ここ重要
Resource: '*'
# 2. 翻訳Lambda関数本体
RealTimeTranslationLambda:
Type: AWS::Lambda::Function
Properties:
FunctionName: !Sub "${AWS::StackName}-ChatTranslator"
Handler: 'index.lambda_handler'
Role: !GetAtt TranslationLambdaExecutionRole.Arn
Runtime: python3.9
Timeout: 15
Code:
S3Bucket: your-code-bucket
S3Key: translation_lambda.zip
# 3. ConnectからLambdaを呼び出せるようにする権限
ConnectInvokePermission:
Type: AWS::Lambda::Permission
Properties:
Action: 'lambda:InvokeFunction'
FunctionName: !GetAtt RealTimeTranslationLambda.Arn
Principal: 'connect.amazonaws.com'
# 自身のインスタンスARNに書き換えてください
SourceArn: !Sub 'arn:aws:connect:${AWS::Region}:${AWS::AccountId}:instance/${ConnectInstanceId}/*'
これでデプロイすれば、権限周りも含めて環境が一発で整います。
3. 仕上げ:Connectのフローに組み込む
あとはAmazon Connectの管理画面(コンタクトフロー)で設定するだけ。
-
Lambda呼び出し: 作ったLambdaを呼び出すブロックを配置。入力パラメータに
MessageとTargetLanguageCodeを渡します。 -
属性の設定: Lambdaから返ってきた
translatedTextを受け取る。 - 表示: オペレーターへの表示テキストに、その属性を埋め込む。
これだけで、オペレーターの画面には「翻訳された日本語」が表示されるようになります。
解放された現場
これでようやく、オペレーターは「翻訳サイトとの往復」という作業から解放されます。
AWS内で完結しているので、機密情報が外に漏れる心配もありません。
Amazon Translateには「Custom Terminology(専門用語辞書)」という機能もあるので、社内用語や製品名を登録しておけば、さらに翻訳精度が上がって便利です。
多言語対応したいがAIがネイティブに使えないという状況ならぜひ試してみてください。