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

news2025/9/12 4:56:42

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

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

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

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

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

 robertgv / chatgpt-aws

聊天GPT + AWS

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

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

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

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

项目步骤

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

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

项目步骤

我把这个项目分为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 区域。

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

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

<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 。然后单击访问管理下左侧菜单中的用户

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

然后单击“下一步:权限”。在这里点击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

在下一页中,我们将获得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的复选框。

点击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 的值。

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

<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的复选框。

点击Next: Review and Add permissions

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

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>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tuxera NTFS2023免费版Mac电脑系统读写软件

使用 Mac 的巨大痛点之一&#xff1a;移动硬盘只能打开文件&#xff0c;但是无法写入新的资料ntfs。有人说格式化硬盘&#xff0c;改成苹果的 macOS扩展格式&#xff0c;但是原先硬盘的数据要转移&#xff0c;而且拿到 Windows 系统里无法被识别。 有人说格式化硬盘&#xff0…

C++ Reference: Standard C++ Library reference: Containers: list: list: emplace

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/emplace/ 公有成员 <list> std::list::emplace template <class... Args> iterator emplace (const_iterator position, Args&&... args);构造并插入元素 通过在position上插入一个…

SpringMVC+SSM整合(完整版)

文章目录一、SpringMVC&#xff08;一&#xff09;SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点4、MVC的工作流程&#xff08;二&#xff09;入门案例1、创建maven工程①引入依赖②配置web.xml③扩展配置方式2、总结&#xff08;三&#xff09;RequestMappi…

大学生个人网页模板 简单网页制作作业成品 极简风格个人介绍HTML网页设计代码下载

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

TZ-PEG-N3 四嗪聚乙二醇叠氮 Tetrazine-PEG-azide

四嗪可用于许多生物成像和生物共轭应用的生物正交反应。目前被广泛应用于蛋白质特定位点功能阐释、亚细胞结构选择性标记、药物靶向传递、活体动物分子影像和生物兼容性材料的制备等。 产品名称 Tetrazine-PEG-N3 四嗪聚乙二醇叠氮 中文名称 四嗪聚乙二醇叠氮 英文名称 …

[附源码]Nodejs计算机毕业设计基于Web的摄影爱好者交流社区Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

java计算机毕业设计ssm在线学习交流平台97t28(附源码、数据库)

java计算机毕业设计ssm在线学习交流平台97t28&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

[附源码]Python计算机毕业设计SSM基于web的教学资源管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

sql错误分析--SQLSyntaxErrorException-

### Error updating database-----指数据库database update错误. Cause: java.sql.SQLSyntaxErrorException--sql语法错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near > 2…

微信公众号开发——向指定用户发送模板消息

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; 微信公众号开发——向指定用户发送模板消息⏱️ 创作时间&#xff1a; 20…

ArrayList源码解析与相关知识点

ArrayList源码解析于相关知识点&#xff08;超级详细&#xff09; 文章目录ArrayList源码解析于相关知识点&#xff08;超级详细&#xff09;ArrayList的继承关系Serializable标记接口Cloneable标记接口RandomAccess标记接口AbstractList类属性构造函数无参构造函数指定初始容量…

网络工程毕业设计 SSM疫情期间医院门诊管理系统(源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统开发流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的疫情…

测试人生 | 转行测试开发,4年4“跳”年薪涨3倍,我的目标是星辰大海(附大厂面经)!

image1080500 66.1 KB 编者按&#xff1a;本文来自霍格沃兹测试学院优秀学员 TesterC&#xff0c;**从运营岗位转行外包测试&#xff0c;再到测试开发&#xff0c;从待业在家到4年4“跳”进入 BAT 大厂&#xff0c;年薪涨了3倍&#xff01;**他是如何完成如此励志的华丽转身的…

12.4、后渗透测试--内网主机数据包流量嗅探

攻击主机&#xff1a; Kali 192.168.11.106靶机&#xff1a;windows server 2008 r2 192.168.11.134Metasploitable2-Linux&#xff1a; 192.168.11.105当成功获取目标机器的会话后&#xff0c;可以使用嗅探手段获取更多信息。前提&#xff1a;获得 meterpreter shell1、加载s…

centos7 安装 zsh + fzf(历史命令搜索神器)

文章目录zsh 安装用 oh-my-zsh 配置 zshfzf 安装结语zsh 安装 参考 用 yum 自动下载安装 zsh yum install -y zsh 安装完成后查看系统可以用的 shell cat /etc/shells 将 zsh 设置为系统默认 shell chsh -s /bin/zsh 退出终端重新登录 查看当前使用的shell echo $0 用 oh-my-z…

大二Web课程设计——美食网站设计与实现(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

ArcGIS:按属性选择要素、按位置选择要素、空间和属性的组合查询;属性表中长度、面积等的量算

目录 01 说明 02 实验目的及要求 03 实验设备及软件平台 04 实验内容与步骤 4.1 由属性选择要素 4.2 由位置选择要素 4.3 查询四川省乐山市范围内的气象站点。 4.4 查询与乐山市相邻的地市州有哪些 4.5 计算四川省各个地市州的面积。 4.6 查询单一栅格或者多个栅格的不同方法。…

HTML+CSS篮球静态网页设计(web前端网页制作课作业)NBA杜兰特篮球运动网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

WPF入门第六篇 WPF的Binding

WPF的Binding 在传统的Windows软件中&#xff0c;大部分都是UI驱动程序的模式&#xff0c;也可以说事件驱动程序。WPF作为Winform的升级&#xff0c;它把UI驱动程序彻底改变了&#xff0c;核心回到了数据驱动程序的模式上面&#xff0c;这样&#xff0c;程序就回到了算法和数据…

[附源码]Python计算机毕业设计服装销售商城系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…