Amazon Web Services ブログ

Amazon Polly を使用した Haptik のパーソナルアシスタントサービス

今回のブログは Haptik Inc. の共同創立者および CTO の Swapan Rajdev 氏より寄稿いただきました。

日々忙しく過ごしている我々にとって、やるべき事柄は増加する一方で達成しなければならない毎日のタスクをすべて管理することは容易ではありません。ミーティング日程を忘れないようにしたり、飛行機のチケットを購入したり、十分な水分補給そしてジムで体を動かすことなど、すべきことを数えだせばきりがありません。スケジュール管理というのは本当に面倒です。

Haptik はインド初のパーソナルアシスタントアプリです。ユーザーは旅行のプランを立てたり、フライトの確認、タクシーの予約そしてリマインダー設定を行うために、このアプリを使用しています。様々な機能を搭載しているこのアプリですが、中でユーザーが頻繁に使用しているのはリマインダー機能です。このアプリのユーザーは、モーニングコールを設定したり、水分補給を忘れずに行うようにリマインダーをセットアップしたり、異なる時間に電話を掛けたり、特別な日にメッセージを送るなど、リマインダーを必要とする様々な事柄に Haptik を使用しています。リマインダー機能を介して、ユーザーはアプリでリマインダーメッセージに関する通知を受信、そしてリクエストした時間に電話を受け取ることができます。

今回のブログでは、タスクを知らせるため指定時間にユーザーに電話をする場合に、当社がどのように Machine Learning や読み上げ機能 (TTS) を使用してユーザーのリマインダーを設定しているのかご説明します。各ユーザーに合わせて電話を掛けたり、何百万人というユーザーに対しリマインダー機能をスケーリングする場合に、どれほど Amazon Polly が役立っているか解説します。

Haptik のリマインダー機能

パーソナルアシスタントに仕事をさせるため、ユーザーは Haptik アプリにアクセスしてボットにメッセージを送信します。当社のシステムにあるメッセージはすべてメッセージパイプラインを通るようになっています。ここでは次の点を検出します。

  • ユーザーが意図するドメイン (リマインダー、旅行、周辺情報など)
  • ユーザーが完了したいタスク (目的)
  • エンティティ (ユーザーのタスクを完了するために必要な別のデータ)

このパイプラインの終わりに近づいた時点でボットがすべての情報を取得している場合は、タスクを完了します。それ以外の場合は、関連性のある質問を返してすべての情報を収集します。

このベーシックパイプラインの他にも、アルゴリズムがいくつもあります。これはディープラーニングを使用してユーザーの介入なしに、ユーザーのタスクを完了しやすくするため、チャット履歴から学習します。

ユーザーに電話を掛ける理由は?

ユーザーに予定のタスクを知らせるため、アプリで通知を送信し電話でも連絡します。Haptik は一般的に使用されている通知技術を使用してユーザーにリマインダーを送信していますが、次のいくつかの理由により、ユーザーに電話を掛ける方がさらに効果的であると当社は考えています。

まず、今のスマートフォン時代では、どのアプリからも大量の通知が届くようになっているので、重要な通知を見逃してしまうことがあります。そのため、知らない番号または Haptik から電話を受け取ることは、スヌーズボタンを押すだけで終わってしまう通常のアラームに比べて効果的です。

2 つめの理由は、当社はリマインダーを設定したタスクの種類に基づいて、電話を掛ける声とその内容を変更し、より優れたユーザーエクスペリエンスを提供しています。たとえば、モーニングコールには穏やかで落ち着いた音声を使用しています。そして時々、ユーザーが気持ち良く元気な状態で起床できるようにするため、電話の終わりに自己啓発的なメッセージも追加しています。Amazon Polly を使用することで、こうした TTS ユースケースの実装をシンプルで信頼性があるものにすることができます。

機能の説明

Haptik のリマインダー機能は、タイムリーそして個人に向けた方法で電話を掛けられるようにするため、様々なテクノロジーをまとめた複雑なドメインの 1 つです。ユーザーのリマインダーを問題なく設定するため、当社ではユーザーから次のデータポイントをキャプチャします。

  • リマインダーを設定する理由 (モーニングコール、ミーティングのリマインダーなど)
  • リマインダーの日付
  • リマインダーの時間
  • 繰り返し起きるリマインダーの場合はその頻度

こうした情報はすべてメタデータを抽出するために使用され、ユーザーに電話を掛けるジョブを担うスケジューラーに送られます。次のコードスニペットは、リマインダーがどのように作成されるのかを示しています。

def create_reminder(user, reminder_task, date, time, repeat_pattern=None):
is_valid = check_reminder_date_time_validity(date, time, repeat_pattern)
	if not is_valid:
		Return False
	notification_content = get_notification_content_for_reminder(user, reminder_Task)
	call_script = get_call_script_for_reminder(user, reminder_task)
	audio_url = generate_audio_using_polly(user, call_script)
 	return schedule_job(user, audio_url, notification_content

TTS に Amazon Polly を使用する

リマインダーをスケジュールする前に、Amazon Polly に合成させたいスクリプトをフェッチします。これには、リマインダーとユーザーのタイプを元にしたコールスクリプトをフェッチする関数を使用します。

Def get_call_script_for_reminder(user, reminder_task):
	all_call_scripts = CallScriptStore.objects.values(‘script’).filter(task_name=reminder_task.name)
	Call_script = random.choice(all_call_sciprts)
	return call_script.format(**{user_name: user.name})

出力例:

Rise and shine, Swapan! (さあ、気持ちの良い 1 日の始まりですよ!)It's a beautiful day - Time to wake up! (お目覚めですか? 今日も素敵な 1 日になりそうですね!)

このスクリプトを取得したら Amazon Polly を呼び出してテキストを音声に変換し、音声ファイルを Amazon S3 にアップロードします。このファイルは後で電話を掛けている間に使うことができます。次のコードを使用して、音声ファイル (mp3) を作成し Amazon S3 にアップロードします。

from boto3 import Session

Def generatea_audio_using_polly(user, call_Script):
session = Session()
polly = session.client("polly", region_name=POLLY_REGION)
response = polly.synthesize_speech(Text=content,
				        OutputFormat="mp3",
				         VoiceId=get_polly_voice_for_task(reminder_ask))

with closing(response["AudioStream"]) as stream:
with open(mp3_file_path, "wb") as file:
	file.write(stream.read())

# Upload to S3
s3 = session.client("s3", region_name=AUDIO_BUCKET_REGION)
s3.upload_file(
 mp3_file_path,
  AUDIO_BUCKET_NAME, “file.mp3"
)

url = "https://s3-{0}.amazonaws.com/{1}/{2}/{3}".format(
 AUDIO_BUCKET_REGION,
AUDIO_BUCKET_NAME,
	“file.mp3”)

Return url

実際のリマインダーの時間になると、スケジューラーシステムが携帯電話番号とコールスクリプトの URL を使用し、コーリングパートナーに API コールを実行します。コールスクリプトが再生されている間にユーザーに電話を掛けます。これでリマインダーが完了します。このコンテンツと電話機能については大変多くのポジティブなフィードバックをお寄せ頂きました。当社は毎日 100,000 件以上のリマインダーを送信しています。

Amazon Polly を使用してパーソナリティを追加

Amazon Polly を使用すると、25 か国語に渡る 51 種類の音声をコールスクリプトで生成することができます。これにより幅広いユーザーエクスペリエンスを提供しやすくなります。コールスクリプトを生成中の以前の関数では「get_polly_voice_for_task」関数を呼び出して voiceId を生成していました。次のコードを使用すると、Amazon Polly でサポートされている様々な音声を使用できます。

session = Session()
polly = session.client("polly", region_name=POLLY_REGION)
response = polly.describe_voices()
voice_ids = [item['Id'] for item in response['Voices']]

当社のユーザーの大半はインドにいるため、多くのユーザーが共感できる「Raveena」(英語で話すインド人女性の声) を頻繁に使用しています。

Amazon Polly とは

当社では様々な TTS のサービスを試しましたが、その差を大きくつけた Amazon Polly が最有力候補となりました。Amazon Polly を選んだいくつかの理由は次の通りです。

開発とイテレーションのスピード – Amazon Polly API はシンプルそして非常に堅牢性に優れています。Amazon Polly API の実装は 1 日以内で完了したほか、コード変更を必要とせず事前準備なしにほぼすべての設定を変更できるようにシステムを設計することができました。また、コールスクリプトの変更や音声を変えるためのツールがあります。そのため、エクスペリエンスに満足する前に様々なスクリプトや音声を使用して実験したり A/B テストを実施することができました。

スケーラビリティ – 先述のアーキテクチャを元に、電話を掛ける時に音声の準備ができているようにするため、事前にコールスクリプトを作成して Amazon S3 に保存します。これにより、ユーザーエクスペリエンスの妨げにならず、何千件もの電話をスケーリングしたりトリガーしやすくなりました。

信頼性とモニタリング – Amazon は Amazon Polly リクエストをモニタリングするための優れたツールを数多く提供しています。当社ではこれまで、ほぼ 100% の信頼性と可用性を経験しています。現在に至るまで Amazon Polly でダウンタイムになったことは 1 回もありません。念のため、5 分間に 5 件以上リクエストが失敗した場合には通知が届くようにアラームを作成しました。Amazon CloudWatch を使えば、簡単にアラームをセットアップすることができます。設定が完了した後で PagerDuty と同期しました。

 

レイテンシー – Amazon CloudWatch は Amazon Polly の異なったメトリクスをモニタリングする優れた方法をいくつか提供しています。次のグラフを見ると、各ファイルに 85 文字ほどを含む Amazon Polly の音声ファイルが作成される平均時間は 17 ミリ秒であることが分かります。この平均時間は非常に速く、何千件もの電話を同時に掛けなければならない状態で実に優れたユーザーエクスペリエンスを提供できるようにしています。


まとめ

Haptik では日々、物事を早めにやり終えるためのシンプルな方法を提供することで、ユーザーの暮らしをより良いものにしようと努めています。今後は複数の言語に対応するサポートを追加してく予定ですが、すでに 24 か国語に対応していることも Amazon Polly を利用する上でのメリットと言えるでしょう。それ以外においては、当社のユーザーをより理解できるようにするため Machine Learning アルゴリズムを使用して常に調整したりテストを行っています。そうすることで、ユーザーにより良いサービスを提供できるようにテクノロジーを使用する様々な方法を見つけています。皆さんのお役に立てば幸いです。


その他の参考資料

Haptik の導入事例「Haptik が AWS を使用してアプリダウンロード 30% の上昇を実現 (Haptik Supports 30% Monthly Increase in App Downloads Using AWS)」をぜひご覧ください。


今回のブログの投稿者について

今回のブログは Haptik Inc. の共同創立者および CTO の Swapan Rajdev 氏に寄稿いただきました。「Haptik はチャットボットを専門とする企業で、フラッグシップ製品は社名と同様のアシスタントアプリで、Android および iOS に対応しています。また、消費者向けアプリの他に、エンタープライズ向けのカスタマーサービス、顧客創出、マーケティングなどのチャットボットソリューションの構築をサポートしています。」と同氏は述べています。