如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

时间:2022-12-16 13:01:24

上周ChatGPT发布了,每个人都在尝试令人惊奇的事情。我也开始使用它并想尝试它如何使用AWSAI 服务进行集成,结果非常棒!

在这篇文章中,我将逐步解释我是如何创建这个项目的,这样你也可以做到!

最重要的是,您无需成为AI 专家即可创建它!

我假设您已经知道 ChatGPT 是什么,并且有一个可以使用 AWS 的帐户。如果您不知道什么是 ChatGPT,请在此处查看什么是 ChatGPT 以及如何亲自尝试。

可以在此处找到该项目的完整代码。

聊天GPT + AWS

上周ChatGPT发布了,每个人都在尝试令人惊奇的事情。我也开始使用它并想尝试它如何使用AWSAI 服务进行集成,结果非常棒!

在这篇文章中,我将逐步解释我是如何创建这个项目的,这样你也可以这样做:

How to create the smartest multilingual Virtual Assistant using AWS and ChatGPT - DEV Community ????‍????????‍????

最重要的是,您无需成为AI 专家即可创建它!

项目步骤

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

我将这个项目分为 8 个步骤:

  1. 录制音频并将其保存为 WAV 格式
  2. 将音频文件上传到 Amazon S3
  3. 使用 Amazon Transcribe 转录和检测保存在 S3 中的音频的语言
  4. Amazon Transcribe 将转录本保存在 Amazon S3 中
  5. 将转录内容发送到 ChatGPT
  6. 从 ChatGPT 接收文本答案并删除代码块
  7. 使用在……中检测到的语言将文本转换为音频

项目步骤

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

我把这个项目分为8个步骤:

  1. 录制音频并将其保存为 WAV 格式
  2. 将音频文件上传到 Amazon S3
  3. 使用 Amazon Transcribe 转录和检测保存在 S3 中的音频的语言
  4. Amazon Transcribe 将转录本保存在 Amazon S3 中
  5. 将转录内容发送到 ChatGPT
  6. 从 ChatGPT 接收文本答案并删除代码块
  7. 使用 Amazon Polly 使用在步骤 3 中检测到的语言将文本转换为音频并下载 MP3 格式的音频
  8. 再现音频文件

在我们开始之前,我们需要定义您需要创建并稍后在以下代码中替换的一般参数。此凭据的创建将在后续步骤中进行说明。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># ChatGPT params
</span><span style="color:var(--syntax-text-color)">chatGPT_session_token</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<SESSION-TOKEN>"</span>

<span style="color:var(--syntax-comment-color)"># AWS params
</span><span style="color:var(--syntax-text-color)">aws_access_key_id</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<ACCESS-KEY-ID>"</span>
<span style="color:var(--syntax-text-color)">aws_secret_access_key</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<SECRET-ACCESS-KEY>"</span>
<span style="color:var(--syntax-text-color)">aws_default_region</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<AWS-REGION>"</span>
<span style="color:var(--syntax-text-color)">aws_default_s3_bucket</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<S3-BUCKET>"</span>

<span style="color:var(--syntax-comment-color)"># Voice recording params
</span><span style="color:var(--syntax-text-color)">samplerate</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-literal-color)">48000</span>
<span style="color:var(--syntax-text-color)">duration</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-literal-color)">4</span> <span style="color:var(--syntax-comment-color)">#seconds
</span></code></span></span>

1.录制音频并保存为WAV格式

首先,我们需要录制音频,我们将在其中提出我们希望 ChatGPT 回答的问题。为此,我们将使用包sounddevice。确保您在操作系统的默认配置中选择了正确的麦克风。
在这种情况下,录制语音的时间为 4 秒。如果你想增加或减少这个时间,只需修改参数duration的值。
该脚本会将音频保存在当前工作目录中名为audio的文件夹中。如果这个文件夹不存在,它将使用os模块创建它。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">record_audio</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">duration</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"[INFO] Start of the recording"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">mydata</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">sd</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">rec</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">int</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">samplerate</span> <span style="color:var(--syntax-error-color)">*</span> <span style="color:var(--syntax-text-color)">duration</span><span style="color:var(--syntax-text-color)">),</span> <span style="color:var(--syntax-text-color)">samplerate</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">samplerate</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-text-color)">channels</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">blocking</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">True</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"[INFO] End of the recording"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">sd</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">wait</span><span style="color:var(--syntax-text-color)">()</span>
    <span style="color:var(--syntax-text-color)">sf</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">write</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">mydata</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">samplerate</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] Recording saved on: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)">#Check if folder "audios" exists in current directory, if not then create it
</span><span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-error-color)">not</span> <span style="color:var(--syntax-text-color)">os</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">path</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">exists</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"audio"</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-text-color)">os</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">makedirs</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"audio"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Create a unique file name using UUID
</span><span style="color:var(--syntax-text-color)">filename</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">'audio/</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">uuid</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">uuid4</span><span style="color:var(--syntax-text-color)">()</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">.wav'</span>

<span style="color:var(--syntax-text-color)">record_audio</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">duration</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

2. 将音频文件上传到 Amazon S3

在这一步中,首先我们需要创建一个Amazon S3 Bucket。为此,我们转到 AWS 控制台并搜索服务 Amazon S3。然后单击创建存储桶

我们需要输入存储桶的名称(存储桶名称在所有 AWS 区域的所有 AWS 账户中必须是唯一的)并选择 AWS 区域。

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

其余参数我们可以将它们保留为默认值。最后,单击页面底部的创建存储桶。

在开始的参数部分中,我们需要用存储桶名称和所选区域替换此值:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">aws_default_region</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<AWS-REGION>"</span>
<span style="color:var(--syntax-text-color)">aws_default_s3_bucket</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<S3-BUCKET>"</span>
</code></span></span>

下一步是创建一个新用户,我们将使用该用户使用boto3访问此 S3 存储桶。Boto3是用于 Python 的 Amazon Web Services (AWS) 软件开发工具包 (SDK),它允许 Python 开发人员编写使用 Amazon S3 和 Amazon EC2 等服务的软件。

要创建新用户,我们在 AWS 控制台上搜索IAM 。然后单击访问管理下左侧菜单中的用户

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

单击右上角的添加用户。我们需要提供一个用户名,然后点击Access key - Programmatic access复选框。

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

然后单击“下一步:权限”。在这里点击Attach existing policies directly然后点击Create policy

在这里我想提一下,我们可以只选择名为AmazonS3FullAccess的策略,它会起作用,但这违背了最小特权权限的原则。在这种情况下,我们将只提供对我们之前创建的存储桶的访问。

创建策略页面上单击选择服务并搜索S3并单击它。然后在操作上单击选项:

  • 列表桶
  • 获取对象
  • 删除对象
  • Put对象

Resources上单击Specific,然后在 bucket 上单击Add ARN,输入我们之前创建的 bucket 名称并单击Add。在对象上还单击添加 ARN并放置之前创建的存储桶名称,在对象名称上单击复选框Any

然后点击Next: TagsNext: Review。最后,为新策略命名并单击Create policy

创建策略后,返回创建用户页面并搜索创建的新策略。如果它没有出现,请单击刷新按钮。

然后点击Next: TagsNext: Review。最后,检查一切正常,然后点击Create user

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

在下一页中,我们将获得Access key IDSecret access key。确保保存它们(特别是秘密访问密钥)并且不要共享它们。在一开始的参数部分,我们需要替换这些值:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">aws_access_key_id</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<ACCESS-KEY-ID>"</span>
<span style="color:var(--syntax-text-color)">aws_secret_access_key</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<SECRET-ACCESS-KEY>"</span>
</code></span></span>

这样我们就有了一个有权写入之前创建的 S3 存储桶的用户。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># Connect to Amazon S3 using Boto3
</span><span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_s3_client</span><span style="color:var(--syntax-text-color)">():</span>
    <span style="color:var(--syntax-declaration-color)">return</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">boto3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">client</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'s3'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">region_name</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">aws_default_region</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">aws_access_key_id</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">aws_access_key_id</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">aws_secret_access_key</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">aws_secret_access_key</span><span style="color:var(--syntax-text-color)">))</span>

<span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">upload_file_to_s3</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-text-color)">s3_client</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">get_s3_client</span><span style="color:var(--syntax-text-color)">()</span>
    <span style="color:var(--syntax-declaration-color)">try</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-declaration-color)">with</span> <span style="color:var(--syntax-text-color)">open</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"rb"</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">f</span><span style="color:var(--syntax-text-color)">:</span> 
            <span style="color:var(--syntax-text-color)">s3_client</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">upload_fileobj</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">f</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">aws_default_s3_bucket</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">)</span>
            <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] File has been uploaded successfully in the S3 bucket: '</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">aws_default_s3_bucket</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">'"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">except</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-declaration-color)">raise</span> <span style="color:var(--syntax-text-color)">ValueError</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[ERROR] Error while uploading the file in the S3 bucket: '</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">aws_default_s3_bucket</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">'"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-text-color)">upload_file_to_s3</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

3-4。使用 Amazon Transcribe 转录和检测保存在 S3 中的音频的语言

Amazon Transcribe是一项 AWS 人工智能 (AI) 服务,可让您轻松地将语音转换为文本。使用自动语音识别 (ASR) 技术,您可以将 Amazon Transcribe 用于各种业务应用程序,包括基于语音的客户服务电话的转录、音频/视频内容的字幕生成以及对内容进行(基于文本的)内容分析音频/视频内容。

为了能够将Amazon Transcribe与在上一步中创建的IAM 用户一起使用,我们需要通过IAM Policy提供对它的访问权限。

为此,我们需要转到AWS 控制台中的IAM,单击左侧菜单中的用户,然后单击之前创建的用户。单击添加权限,然后直接附加现有策略。搜索AmazonTranscribe并单击AmazonTranscribeFullAccess的复选框。

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

点击Next: Review and Add permissions

此时此用户应该有 2 个附加策略:

添加此额外权限后,您无需修改​​/更新access key idsecret access key

在以下 python 代码中,我们通过boto3包使用Amazon Transcribe将音频中录制的语音转录为文本。Amazon Transcribe 还会检测音频中使用的语言。

在这里,您可以阅读boto3 文档中有关TranscribeService的所有文档。

转录保存在 Amazon S3 中的 JSON 文件中。您可以选择将转录本保存在您自己的 Amazon S3 存储桶中,或者让 Amazon Transcribe 使用安全的默认存储桶。在我的例子中,我选择了拥有的 Amazon S3 存储桶上的默认选项。如果我们选择默认选项,则在作业到期(90 天)时删除成绩单。如果我们想在这个过期日期之后保留抄本,我们必须下载它。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># Generate UUID for the job id
</span><span style="color:var(--syntax-text-color)">job_id</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">str</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">uuid</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">uuid4</span><span style="color:var(--syntax-text-color)">())</span>

<span style="color:var(--syntax-comment-color)"># Connect to Amazon Transcribe using Boto3
</span><span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_transcribe_client</span><span style="color:var(--syntax-text-color)">():</span>
    <span style="color:var(--syntax-declaration-color)">return</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">boto3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">client</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'transcribe'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">region_name</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">aws_default_region</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">aws_access_key_id</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">aws_access_key_id</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">aws_secret_access_key</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">aws_secret_access_key</span><span style="color:var(--syntax-text-color)">))</span>

<span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_text_from_audi</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-text-color)">transcribe</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">get_transcribe_client</span><span style="color:var(--syntax-text-color)">()</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"[INFO] Starting transcription of the audio to text"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">transcribe</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">start_transcription_job</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">TranscriptionJobName</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">job_id</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">Media</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-string-color)">'MediaFileUri'</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"https://</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">aws_default_s3_bucket</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">.s3.</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">aws_default_region</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">.amazonaws.com/</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">},</span> <span style="color:var(--syntax-text-color)">MediaFormat</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">'wav'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">IdentifyLanguage</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">True</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"[INFO] Transcribing text: *"</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-text-color)">end</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">""</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">while</span> <span style="color:var(--syntax-text-color)">True</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">status</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">transcribe</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get_transcription_job</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">TranscriptionJobName</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">job_id</span><span style="color:var(--syntax-text-color)">)</span>
        <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">status</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'TranscriptionJob'</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-string-color)">'TranscriptionJobStatus'</span><span style="color:var(--syntax-text-color)">]</span> <span style="color:var(--syntax-error-color)">in</span> <span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'COMPLETED'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'FAILED'</span><span style="color:var(--syntax-text-color)">]:</span>
            <span style="color:var(--syntax-declaration-color)">break</span>
        <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"*"</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-text-color)">end</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">''</span><span style="color:var(--syntax-text-color)">)</span>
        <span style="color:var(--syntax-text-color)">time</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">sleep</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">2</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">""</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-comment-color)">#End of line after loading bar
</span>    <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">status</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'TranscriptionJob'</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-string-color)">'TranscriptionJobStatus'</span><span style="color:var(--syntax-text-color)">]</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">'COMPLETED'</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">response</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">urllib</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">request</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">urlopen</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">status</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'TranscriptionJob'</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-string-color)">'Transcript'</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-string-color)">'TranscriptFileUri'</span><span style="color:var(--syntax-text-color)">])</span>
        <span style="color:var(--syntax-text-color)">data</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">json</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">loads</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">response</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">read</span><span style="color:var(--syntax-text-color)">())</span>
        <span style="color:var(--syntax-text-color)">language_detected</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'results'</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-string-color)">'language_identification'</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-string-color)">'code'</span><span style="color:var(--syntax-text-color)">]</span>
        <span style="color:var(--syntax-text-color)">transcript</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">data</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'results'</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-string-color)">'transcripts'</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">][</span><span style="color:var(--syntax-string-color)">'transcript'</span><span style="color:var(--syntax-text-color)">]</span>
        <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] Transcription completed!"</span><span style="color:var(--syntax-text-color)">)</span>
        <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] Transcript language: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">language_detected</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
        <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] Transcript text: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">transcript</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
        <span style="color:var(--syntax-declaration-color)">return</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">transcript</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">language_detected</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">else</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-declaration-color)">raise</span> <span style="color:var(--syntax-text-color)">ValueError</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"[ERROR] The process to convert audio to text using Amazon Transcribe has failed."</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-text-color)">transcript</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">language_detected</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">get_text_from_audi</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

5. 将转录发送到 ChatGPT

从 Amazon Transcribe 收到成绩单后,我们需要将其发送到 ChatGPT。为此,我使用了revChatGPT包。要使用这个包,我们需要对 ChatGPT 进行身份验证,这可以使用用户名密码或使用session_token来完成。就我而言,因为我使用的是 Google OAuth 身份验证方法,所以我将使用session_token

要获取会话令牌,我们需要登录到ChatGPT,然后单击F12或右键单击并检查。然后搜索Application选项卡并在左侧菜单中搜索Cookies。选择网站https://chat.openai.com然后搜索名称为__Secure-next-auth.session-token 的cookie并复制此 cookie 的值。

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

在一开始的参数部分,我们需要用您拥有的会话令牌值替换此值:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">chatGPT_session_token</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"<SESSION-TOKEN>"</span>
</code></span></span>

如果您想使用电子邮件密码作为身份验证方法,您可以在此处查看操作步骤。

完成后,我们应该能够使用 Python 连接到 ChatGPT。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_gpt_answer</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">prompt</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] Sending transcript to ChatGPT"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">config</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-string-color)">"email"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"<API-KEY>"</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-string-color)">"session_token"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">chatGPT_session_token</span><span style="color:var(--syntax-text-color)">}</span>
    <span style="color:var(--syntax-text-color)">chatbot</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">Chatbot</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">config</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">conversation_id</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">None</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">chatbot</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">refresh_session</span><span style="color:var(--syntax-text-color)">()</span>
    <span style="color:var(--syntax-text-color)">response</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">chatbot</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get_chat_response</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">prompt</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">output</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"text"</span><span style="color:var(--syntax-text-color)">)[</span><span style="color:var(--syntax-string-color)">"message"</span><span style="color:var(--syntax-text-color)">]</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] ChatGPT answer: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">response</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">return</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">response</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-text-color)">chatgpt_answer</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">get_gpt_answer</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">transcript</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

6. 从 ChatGPT 接收文本答案并删除代码块

一旦我们从ChatGPT得到答案,我们就可以得到一个或多个代码块。在这种情况下,我正在应用正则表达式函数来删除代码块。

您还可以在此处添加自己的规则,以了解如何过滤或清除来自 ChatGPT 的答案。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">clean_audio_text</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">text</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-comment-color)"># Clean the code chuncks from the audio using regex
</span>    <span style="color:var(--syntax-text-color)">result</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">re</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">sub</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">r</span><span style="color:var(--syntax-string-color)">"```

[^\S\r\n]*[a-z]*\n.*?\n

```"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">''</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">text</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">re</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">DOTALL</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">return</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">result</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

7. 使用 Amazon Polly 使用在步骤 3 中检测到的语言将文本转换为音频并下载 MP3 格式的音频

Amazon Polly使用深度学习技术合成听起来自然的人类语音,因此我们可以将文本转换为语音。

从 ChatGPT 清除答案后,我们准备将其发送到Amazon Polly

为了能够将Amazon Polly与创建的用户一起使用,我们需要像在上一步中对Amazon Transcribe所做的那样,使用策略提供对它的访问权限。

为此,我们需要转到AWS 控制台中的IAM,单击左侧菜单中的用户,然后单击之前创建的用户。然后单击添加权限,然后直接附加现有策略。搜索AmazonPolly并单击AmazonPollyFullAccess的复选框。

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

点击Next: Review and Add permissions

此时此用户应该有 3 个附加策略:

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

Amazon Polly支持多种语言和不同性别。在这种情况下,我提供的代码预定义了 3 种语言:英语、西班牙语和加泰罗尼亚语。另请注意,对于每种语言,您可以根据国家/地区的不同而有不同的变化。例如,对于英语,我们有en-USen-GBen-IN等。

此处提供了所有可用语言和变体的完整列表。

将文本发送到 Amazon Polly 后,我们将收到包含合成语音的流。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_polly_client</span><span style="color:var(--syntax-text-color)">():</span>
    <span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">boto3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">client</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'polly'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">region_name</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">aws_default_region</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">endpoint_url</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"https://polly.</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">aws_default_region</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">.amazonaws.com"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">aws_access_key_id</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">aws_access_key_id</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">aws_secret_access_key</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">aws_secret_access_key</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">generate_audio</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">polly</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">text</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">output_file</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">voice</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">format</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">'mp3'</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-text-color)">text</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">clean_audio_text</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">text</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">resp</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">polly</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">synthesize_speech</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">Engine</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">'neural'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">OutputFormat</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">format</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">Text</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">text</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">VoiceId</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">voice</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">soundfile</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">open</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">output_file</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'wb'</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">soundBytes</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">resp</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">'AudioStream'</span><span style="color:var(--syntax-text-color)">].</span><span style="color:var(--syntax-text-color)">read</span><span style="color:var(--syntax-text-color)">()</span>
    <span style="color:var(--syntax-text-color)">soundfile</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">write</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">soundBytes</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">soundfile</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">close</span><span style="color:var(--syntax-text-color)">()</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] Response audio saved in: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">output_file</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_speaker</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">language_detected</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-comment-color)"># Get speaker based on the language detected by Amazon Transcribe (more info about available voices: https://docs.aws.amazon.com/polly/latest/dg/voicelist.html)
</span>    <span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">""</span>
    <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">language_detected</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">"en-US"</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Joanna"</span>
    <span style="color:var(--syntax-declaration-color)">elif</span> <span style="color:var(--syntax-text-color)">language_detected</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">"en-GB"</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Amy"</span>
    <span style="color:var(--syntax-declaration-color)">elif</span> <span style="color:var(--syntax-text-color)">language_detected</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">"en-IN"</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Kajal"</span>
    <span style="color:var(--syntax-declaration-color)">elif</span> <span style="color:var(--syntax-text-color)">language_detected</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">"ca-ES"</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Arlet"</span>
    <span style="color:var(--syntax-declaration-color)">elif</span> <span style="color:var(--syntax-text-color)">language_detected</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">"es-ES"</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Lucia"</span>
    <span style="color:var(--syntax-declaration-color)">elif</span> <span style="color:var(--syntax-text-color)">language_detected</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">"es-MX"</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Mia"</span>
    <span style="color:var(--syntax-declaration-color)">elif</span> <span style="color:var(--syntax-text-color)">language_detected</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">"es-US"</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Lupe"</span>
    <span style="color:var(--syntax-declaration-color)">else</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Joanna"</span>
        <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[WARNING] The language detected </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">language_detected</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)"> is not supported on this code. In this case the default voice is Joanna (en-US)."</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] Speaker selected: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">voice</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-declaration-color)">return</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">voice</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-text-color)">polly</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">get_polly_client</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-text-color)">voice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">get_speaker</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">language_detected</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">output_file</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"audio/</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">job_id</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">.mp3"</span>
<span style="color:var(--syntax-text-color)">generate_audio</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">polly</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">chatgpt_answer</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">output_file</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-text-color)">voice</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">voice</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

8.再现音频文件

最后,我们只需要播放来自Amazon Polly 的音频结果。

根据操作系统或您运行的位置,它可能无法工作。在我的例子中,当我在 macOS 中从终端运行函数speak_script(output_file)时,它工作正常。如果您使用的是像 Jupyter Notebook 这样的笔记本,那么请使用函数speak_notebook(output_file)

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">speak_notebook</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">output_file</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] Start reproducing response audio"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">display</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">Audio</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">output_file</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">autoplay</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">True</span><span style="color:var(--syntax-text-color)">))</span>

<span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">speak_script</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">output_file</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"[INFO] Start reproducing response audio"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">return_code</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">subprocess</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">call</span><span style="color:var(--syntax-text-color)">([</span><span style="color:var(--syntax-string-color)">"afplay"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">output_file</span><span style="color:var(--syntax-text-color)">])</span>

<span style="color:var(--syntax-text-color)">speak_script</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">output_file</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

示例输出

如果我们按照前面的所有步骤进行操作,我们应该准备好开始使用我们新的多语言虚拟助手了。为了向您展示输出的样子,我记录了自己问“什么是 Amazon Web Services?” 您可以清楚地看到,这正是 Amazon Transcribe 生成的文字记录,然后是 ChatGPT 提供的答案。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ python3 ChatGPT-AWS.py
[INFO] Start of the recording
[INFO] End of the recording
[INFO] Recording saved on: audio/6032133a-ec26-4fa0-8d0b-ad705293be09.wav
[INFO] File has been uploaded successfully in the S3 bucket: 'chatgpt-transcribe'
[INFO] Starting transcription of the audio to text
[INFO] Transcribing text: *********
[INFO] Transcription completed!
[INFO] Transcript language: en-US
[INFO] Transcript text: What is Amazon Web Services?
[INFO] Sending transcript to ChatGPT
[INFO] ChatGPT answer: Amazon Web Services (AWS) is a cloud computing platform that provides a wide range of services, including computing, storage, and content delivery. AWS offers these services on a pay-as-you-go basis, allowing businesses and individuals to access the resources they need without having to invest in expensive infrastructure. AWS is widely used by organizations of all sizes, from small startups to large enterprises.
[INFO] Speaker selected: Joanna
[INFO] Response audio saved in: audio/168a94de-1ba2-4f65-8a4c-d3c9c832246d.mp3
[INFO] Start reproducing response audio
</code></span></span>

我希望您像我在构建和使用这些服务时一样喜欢它。我认为这些最先进的技术有很多机会/潜力,当我们将所有这些技术结合使用时,结果会很棒!