ほぼリアルタイムのインテリジェントな応答 2D デジタル ヒューマン構築

b8495694281d8a6711042ecfdf825d47.gif

背景

GPT-3.5 などの大規模な言語モデルが台頭して広く採用されるずっと前から、教育業界は AI 支援教育の分野でさまざまな試みを行ってきました。教育業界では、人工知能テクノロジーの導入により、教育目標の達成、教育の質の向上、学習効率の向上、学習体験の向上、学習成果の向上に役立ちます。たとえば、人工知能テクノロジーは、教師が教室をより適切に管理し、生徒の学習ニーズをより適切に特定し、パーソナライズされた学習コンテンツをより適切に提供し、生徒の学習成果をより適切に評価し、学習サポートをより適切に提供するのに役立ちます。さらに、人工知能テクノロジーは、教育業界の自動化を改善し、効率と有効性を向上させるのにも役立ちます。つまり、教育業界における人工知能テクノロジーの導入は大きな変化をもたらし、教育業界により多くの発展の機会をもたらすでしょう。

Amazon Cloud Technology は、教育業界の顧客の技術革新とビジネス革新をサポートするために、より便利で、より高速で、より強力な AI サービスを提供することにも取り組んでいます。特に、Amazon Transcribe、Amazon Polly、Amazon Textract、Amazon Translate、Amazon Personalize、Amazon Rekognition、Amazon SageMaker などの製品は、自然言語処理、グラフィックスと画像処理、モデル開発の面で教育業界に強力な技術サポートを提供します。展開。

この記事では、Amazon Transcribe、Amazon Polly、OpenAI の大規模言語モデルと D-ID.com の 2D デジタル ヒューマン生成テクノロジーを組み合わせて、音声会話を備えたインテリジェントな 2D デジタル ヒューマン デザインのデモンストレーション サービスとその具体的な実装プロセスを紹介します。

ソリューションアーキテクチャ

8f4315d340e180ada53c7c21526aeca6.png

音声入力、音声出力、および 2D デジタル ヒューマン ビデオ再生の全体的な効果を統一されたユーザー インターフェイスで表現するために、このソリューションでは WebUI 機能を実現するために Gradio フレームワークを選択します。レンダリングされた WebUI は次のとおりです。

646c5632b3214b8d8eca0f6c9dc32239.jpeg

ユーザーは、テキストコンテンツを直接入力するか、マイクを使用して音声を入力できます。テキストコンテンツは、Langchain を使用して特定のコンテキストを追加し、OpenAI の GPT インターフェイス呼び出しに送信します。音声入力は、最初に音声からテキストへの Amazon Transcribe サービスを呼び出します。変換。GPT インターフェースから返されたテキストコンテンツは Amazon Polly を呼び出して音声ファイルを形成し、その音声ファイルは D-ID.com が提供する API として使用され、2D ダイナミックビデオがレンダリングされ、自動的に前面に表示および再生されます。終わり。

このソリューションでは、音声入力、音声出力、テキスト応答生成、デジタルヒューマンビデオ生成の機能を自由に組み合わせたり、置き換えたりすることができます。特に、OpenAI インターフェイスへの呼び出しは、自己展開された大規模言語モデルへの呼び出しに置き換えることができ、2D デジタル ヒューマン ビデオの生成には、Heygen などの他の同様のサービスも考慮できます。

実装

音声入力部

Amazon Transcribe は、リアルタイム (ストリーミング) または Amazon S3 バケット内の音声ファイルからの音声の文字起こし (バッチ処理) をサポートしています。Transcribe は、さまざまな国の最大数十の言語をサポートします。

Transcribe のリアルタイム文字起こし機能は非常に強力です。ストリーミング データの処理中、継続的に前のコンテキストを使用して結果をリアルタイムで修正します。以下のスクリーンショットで、Transcribe のリアルタイム文字起こし出力の効果を確認できます。

fbe50bdbe8cccc494cb35b8c95cb6f85.png

このソリューションでは、バッチ処理を使用して入力音声の文字起こしを処理します。具体的なコードは次のとおりです。

def transcribe_func_old(audio):
    audio_file = open(audio, "rb")
    file_name = audio_file.name
    print("audio_file: "+file_name)
    
    # Set up the job parameters
    job_name = "ai-bot-demo"
    text_output_bucket = 'ai-bot-text-material' #this bucket is in us-west-1
    text_output_key = 'transcriptions/question.json'
    text_output_key = 'transcriptions/'+job_name+'.json'
    language_code = 'zh-CN'


    # Upload the file to an S3 bucket
    audio_input_bucket_name = "ai-bot-audio-material"
    audio_input_s3_key = "questions/tmp-question-from-huggingface.wav"
    
    s3.upload_file(file_name, audio_input_bucket_name, audio_input_s3_key)
    
    # Construct the S3 bucket URI
    s3_uri = f"s3://{audio_input_bucket_name}/{audio_input_s3_key}"


    response = transcribe.list_transcription_jobs()
    
    # Iterate through the jobs and print their names
    for job in response['TranscriptionJobSummaries']:
        print(job['TranscriptionJobName'])
        if job['TranscriptionJobName'] == job_name:
            response = transcribe.delete_transcription_job(TranscriptionJobName=job_name)
            print("delete transcribe job response:"+str(response))


    # Create the transcription job
    response = transcribe.start_transcription_job(
        TranscriptionJobName=job_name,
        Media={'MediaFileUri': s3_uri},
        MediaFormat='wav',
        LanguageCode=language_code,
        OutputBucketName=text_output_bucket,
        OutputKey=text_output_key
    )
    
    print("start transcribe job response:"+str(response))
    job_name = response["TranscriptionJob"]["TranscriptionJobName"]
    
    # Wait for the transcription job to complete
    while True:
        status = transcribe.get_transcription_job(TranscriptionJobName=job_name)['TranscriptionJob']['TranscriptionJobStatus']
        if status in ['COMPLETED', 'FAILED']:
            break
        print("Transcription job still in progress...")
        time.sleep(1)
    
    # Get the transcript
    #transcript = transcribe.get_transcription_job(TranscriptionJobName=job_name)
    transcript_uri = transcribe.get_transcription_job(TranscriptionJobName=job_name)['TranscriptionJob']['Transcript']['TranscriptFileUri']
    print("transcript uri: " + str(transcript_uri))
    
    transcript_file_content = s3.get_object(Bucket=text_output_bucket, Key=text_output_key)['Body'].read().decode('utf-8')
    print(transcript_file_content)
    json_data = json.loads(transcript_file_content)


    # Extract the transcript value
    transcript_text = json_data['results']['transcripts'][0]['transcript']
    return transcript_text

左にスワイプするとさらに表示されます

上記のコードは主に、いくつかのステップの作業を完了します。

  1. 処理する音声ファイルを Amazon S3 にアップロードします

  2. Amazon Transcribe ワーカータスクを作成し、ポーリングしてタスクのステータスを確認します

  3. Amazon S3 から Amazon Transcribe 完了タスクの解析結果を取得する

応答内容生成部

このソリューションでは、Langchain のオープンソース フレームワークを使用し、OpenAI に基づくカバレッジ インターフェイスを呼び出し、メモリ ライブラリを使用して 5 ラウンド分の対話コンテキストを保存することで、回答コンテンツが生成されます。実際の顧客シナリオでは、返信内容の有効性と客観性を規制するためのより豊富な方法が考えられます。

たとえば、Langchain のダイアログ テンプレートを使用して大規模モデルの役割を事前設定したり、ナレッジ ベースの構築と Amazon Kendra や Amazon Opensearch などの検索エンジンを使用して大規模モデルの応答のコンテンツをさらに制限したりできます。関連するコードは次のとおりです。

memory = ConversationBufferWindowMemory(k=5) 
conversation = ConversationChain(     
    llm=OpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()], max_tokens=2048, temperature=0.5),      
     memory=memory, 
)

左にスワイプするとさらに表示されます

音声出力部

Amazon Polly はテキストを本物のような音声に変換します。複数の言語をサポートしており、中国語の音声シミュレーションを含む、さまざまなリアルな音声シミュレーションが含まれています。

さまざまな場所で動作する音声対応アプリケーションを構築し、顧客に合った音声を選択できます。Amazon Polly は、音声合成アプリケーション用の XML ベースの W3C 標準マークアップ言語である音声合成マークアップ言語 (SSML) もサポートしており、文の分割、アクセント、イントネーションに共通の SSML タグの使用をサポートします。カスタム Amazon SSML タグは、ニュースキャスターのスタイルで特定の音声を発する機能などの独自のオプションを提供します。この柔軟性により、聴衆の注意を引きつけて保持する本物のような音声を作成することができます。

このソリューションでは、Polly のリアルタイム音声生成インターフェイスを使用し、中国語の発音である Zhiyu の VoiceID を使用し、特定の文字の発音をカスタマイズします。これは、Polly (Lexion) の非常に便利な機能でもあります。

def polly_text_to_audio(audio_file_name, text, audio_format):


    if os.path.exists(audio_file_name):
        os.remove(audio_file_name)
        print("output mp3 file deleted successfully.")
    else:
        print("output mp3 file does not exist.")


    polly_response = polly.synthesize_speech(
        Text=text,
        OutputFormat=audio_format,  
        SampleRate='16000',
        VoiceId='Zhiyu',
        LanguageCode='cmn-CN',
        Engine='neural',
        LexiconNames=['xxxxCN']
    )   
    
    # Access the audio stream from the response
    if "AudioStream" in polly_response:
        # Note: Closing the stream is important because the service throttles on the
        # number of parallel connections. Here we are using contextlib.closing to
        # ensure the close method of the stream object will be called automatically
        # at the end of the with statement's scope.
            with closing(polly_response["AudioStream"]) as stream:
               try:
                # Open a file for writing the output as a binary stream
                    with open(audio_file_name, "wb") as file:
                       file.write(stream.read())
               except IOError as error:
                  # Could not write to file, exit gracefully
                  print(error)
                  sys.exit(-1)


    else:
        # The response didn't contain audio data, exit gracefully
        print("Could not stream audio")
        sys.exit(-1)

左にスワイプするとさらに表示されます

2D デジタル ヒューマン ビデオの生成部分

ここでは、外部のサードパーティ SaaS サービスを使用します。このサービスは D-ID.com によって提供されており、対応する API はテキスト入力と顔写真を直接受信して、対応する動的なブロードキャスト ビデオを生成できます。また、音声ファイルと画像を入力として受け入れることもできます。

テキストを入力すると、API インターフェイスは Amazon の Polly サービスでさまざまな音声 ID を指定して、音声を自動的に合成することを選択できます。

このソリューションでは、中国語音声出力の効果を反映したいのですが、D-ID の API インターフェイスでは中国語テキストに対して中国語音声 ID を直接指定できません。そこで、Polly の API を使用して最初に音声を生成し、次に音声と画像を D-ID のインターフェイスに送信してビデオを生成することにしました。具体的なコードは次のとおりです。

def generate_talk_with_audio(input, avatar_url, api_key = did_api_key):
    url = "https://api.d-id.com/talks"
    payload = {
        "script": {
            "type": "audio",
            "audio_url": input
        },
        "config": {
            "auto_match": "true",
            "result_format": "mp4"
        },
        "source_url": avatar_url
    }
    headers = {
        "accept": "application/json",
        "content-type": "application/json",
        "authorization": "Basic " + api_key
    }


    response = requests.post(url, json=payload, headers=headers)
    return response.json()




def get_a_talk(id, api_key = os.environ.get('DID_API_KEY')):
    url = "https://api.d-id.com/talks/" + id
    headers = {
        "accept": "application/json",
        "authorization": "Basic "+api_key
    }
    response = requests.get(url, headers=headers)
    return response.json()


def get_mp4_video(input, avatar_url=avatar_url):
    response = generate_talk_with_audio(input=input, avatar_url=avatar_url)
    print("DID response: "+str(response))
    talk = get_a_talk(response['id'])
    video_url = ""
    index = 0
    while index < 30:
        index += 1
        if 'result_url' in talk:    
            video_url = talk['result_url']
            return video_url
        else:
            time.sleep(1)
            talk = get_a_talk(response['id'])
    return video_url

左にスワイプするとさらに表示されます

実際のアプリケーションでは、Amazon Polly でほぼリアルタイムのテキスト読み上げを実現したい場合は、大規模な言語モデルのストリーミング出力を組み合わせてリアルタイム処理を行うことができます。サンプルコードは次のとおりです。

response = generate_response(prompt)
# create variables to collect the stream of events
collected_events = []
completion_text = ''
sentance_to_polly = ''
separators = ['?','。',',','!']
already_polly_processed = ''
# iterate through the stream of events
for event in response:
    collected_events.append(event)  # save the event response
    event_text = event['choices'][0]['text']  # extract the text
    if event_text in separators:
        sentance_to_polly = completion_text.replace(already_polly_processed,'') 
        #print("sentance_to_polly: "+sentance_to_polly)
        polly_text_to_audio(response_audio_filename, sentance_to_polly, 'mp3')
        already_polly_processed = completion_text
    completion_text += event_text  # append the text
    print(event_text, end='', flush=True)  # print the delay and text

左にスワイプするとさらに表示されます

上記のコードは、Amazon Polly のリアルタイム処理機能を利用しています。返されたストリームのテキストデータによると、「?」が見つかりました。「、」。「、」、「、」!句読点を分割するときは、すぐに Amazon Polly を呼び出して最新のテキストの音声を生成し、それを現在のビデオ ファイルの末尾に追加します。テキストストリームを受信すると、基本的に音声変換は完了します。

このソリューションは現在、huggingface Web サイト (https://huggingface.co/spaces/xdstone1/ai-bot-demo) が提供するワークスペースでホストされており、対応するコードは次のチャネルからも入手できます。

git lfs install
git clone https://huggingface.co/spaces/xdstone1/ai-bot-demo

左にスワイプするとさらに表示されます

このスキームのデモビデオは、次のリンクから視聴できます。

https://d3g7d7eldf7i0r.cloudfront.net/。

要約する

今年は AIGC が勃発した年であり、教育業界の顧客にとって業界の転換期となる年でもあります。この重要な歴史的結節点において、Amazon Cloud Technology は顧客とともにこれらの新たな機会と課題に前向きに取り組み、顧客のニーズに導かれて、顧客が AI の波によってもたらされる利益を掴めるよう支援します。

現時点では、この記事で示した 2D デジタル ヒューマン ソリューションに加えて、Amazon クラウド テクノロジーは、顧客が 3D デジタル ヒューマンやその他の 3D デジタル画像に基づいたライブ ブロードキャストやインタラクションなどのソリューションを提供することもできます。同時に、Warp Engine (https://www.warpengine.cc/) などの技術パートナーをさらに紹介し、デジタル ヒューマン、デジタル画像ライブ ブロードキャスト、オンデマンド、インタラクティブなどのソリューション全体を強化します。シナリオを改善し、より多くの教育業界を支援し、顧客が AI テクノロジーの採用と実装を加速します。

この記事の著者

ca987e33899dee354fef4f00d31158c6.jpeg

シュエ・ドン

Amazon クラウド テクノロジー ソリューション アーキテクト。Amazon クラウド プラットフォームに基づくソリューションのコンサルティングと設計を担当し、現在 Amazon クラウド テクノロジー大中華圏の教育業界の顧客にサービスを提供しています。サーバーレスやセキュリティなどの技術的な方向に焦点を当てます。

30dbcc876fa86a09978c1e4854fd8e25.gif

8a4836c092695d8fd8c4697037080772.gif

聞いたので、下の 4 つのボタンをクリックしてください

バグに遭遇することはありません!

1159c7bb319dfd3bdf3b0d709d67d456.gif

おすすめ

転載: blog.csdn.net/u012365585/article/details/132400311