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

上周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.rhkb.cn/news/3929.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT编程能力实证研究

CODEWISDOM ChatGPT编程能力实证研究 刘子夕 冯洋1 陈碧欢2 娄一翎 彭鑫 陈振宇 1 fengyangnju.edu.cn; 2 bhchenfudan.edu.cn 南京大学 计算机软件新技术国家重点实验室 复旦大学 计算机科学技术学院 摘要 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;得到了快…

chatgpt赋能python:Python如何帮你更聪明地买股票

Python 如何帮你更聪明地买股票 股票市场是一场风险与机遇并存的游戏&#xff0c;每位投资者都希望能够购买到高品质的股票并赚取稳定的利润。而借助 Python 编程语言&#xff0c;你可以更加轻松地分析市场趋势&#xff0c;提高股票投资的准确性和盈利能力。 一、数据分析与预…

谷歌版 ChatGPT 翻车!市值暴跌七千亿

01 前言 最近微软出品的 ChatGPT 确实引起很大的关注呀&#xff0c;这不&#xff0c;谷歌就紧跟发布了谷歌版 ChatGPT - Bard&#xff0c;今天带大家来看看微谷的第一波较量。 源自&#xff1a;机器之心 原文&#xff1a;https://mp.weixin.qq.com/s/1mkAlJbtYCmQcz_mV9cdoA 如…

基于ChatGPT完美替代 Grammarly润色和语法纠错的免费插件!

OpenAI Polisher Bob Plugin 简介 ChatGPT 向我们展示了 GPT 模型的伟大之处&#xff0c;所以我使用 ChatGPT 的 API 实现了这个用来给语言润色和语法纠错的 Bob 插件&#xff0c;效果拔群&#xff01;完美替代 Grammarly! 使用截图 使用方法 安装 Bob (版本 > 0.50)下载此插…

ChatGPT Prompting开发实战(一)

第7章 ChatGPT Prompting开发实战 7.1 Prompting在LangChain框架中的应用 本节跟大家讲提示工程(Prompt Engineering),主要基于工业级的源码以及具体的项目,无论是工程人员,还是不具有技术背景的人员,大家多少都听说过提示词,或者频繁使用过,简单而言,当我们使用OpenA…

ChatGPT prompt指令大全

ChatGPT prompt指令大全 更多Prompt自动使用&#xff0c;可以在chrome插件中搜索 WebChatGPT&#xff0c;没有账号的&#xff0c;可以拉到文章最下面。 目录 担任雅思写作考官 写小说 充当 Linux 终端 充当英语翻译和改进者 充当论文润色者&#xff08;拿摘要部分举例&am…

火爆出圈的OpenAI模型ChatGPT体验

1、ChatGPT简要介绍 ChatGPT是一种高效的语言模型&#xff0c;全称为"聊天式自动回复生成技术"&#xff08;Chat-based Automatic Reply Generation Technology&#xff09;&#xff0c;用于预测人类语言的后续内容。它是基于OpenAI的GPT-3模型构建的&#xff0c;具…

每日一个 ChatGPT 使用小技巧系列之1 - 给出提纲,让 ChatGPT 帮你写作

我以前写过一篇文章&#xff0c;介绍了我日常工作和学习中使用 ChatGPT 的一些技巧&#xff1a; 与其整天担心 AI 会取代程序员&#xff0c;不如先让 AI 帮助自己变得更强大 为代码生成对应的单元测试代码 利用 ChatGPT 帮助自己研读经典框架的源代码 代码重构和性能优化 阅读…

ChatGPT最新研究:可能影响80%工作岗位,收入越高影响越大

Datawhale分享 最新&#xff1a;ChatGPT影响&#xff0c;来源&#xff1a;机器之心 ChatGPT 的影响涵盖所有收入阶层&#xff0c;且高收入工作可能面临更大的风险。 改变经济、劳动力和教育环境 和很多专家一样&#xff0c;Altman 担心人工智能技术的强大能力会制造过多虚假信…

爆红的chatgpt是如何诞生的?

今年&#xff0c;人工智能行业最大的新闻当属 DeepMind的 AlphaGo战胜了李世石&#xff0c;这是 AlphaGo在与人类围棋高手对战中&#xff0c;以总比分4比1击败李世石。 DeepMind团队公布的研究成果在 AI界引起了巨大反响。它从深度学习&#xff08;Deep Learning&#xff09;入…

爆火的ChatGPT太强了,写代码、改bug,网友:可取代Stack Overflow了

关于 AI 的问题&#xff0c;可以直接问 AI。 OpenAI 新上线的 ChatGPT 可谓是火爆出圈&#xff0c;这个对话模型可以回答后续问题&#xff0c;承认错误&#xff0c;挑战不正确的前提&#xff0c;还能帮你修改代码中的 bug…… 只要和它聊上几句&#xff0c;一会儿功夫它就能把…

有趣!深挖推特开源算法;ChatGPT封号对策汇总;ControlNet最全教程;搭建ChatGPT应用;构建开源项目阅读工作流 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『推特开源了推荐算法源码』大佬分析出了11条有意思的规律…… 3月31日&#xff0c;Twitter 对其推荐算法进行了开源。Steven Tey 持续…

全球最大的 ChatGPT 开源替代品来了,支持 35 种语言,网友:不用费心买 ChatGPT Plus了!...

整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 自去年 11 月 ChatGPT 面向公众测试以来&#xff0c;OpenAI 一直占据各大科技网站的头版头条&#xff0c;以及成为很多开发者工具的首选。ChatGPT 的落地不仅仅可以提供代码建议、总结长文本、回答问题…

对标ChatGPT的开源中文方案

目录 前言 一、Meta发布大语言模型LLaMA 二、斯坦福基于 Meta 的 LLaMA 7B 模型微调出Alpaca 三、基于TencentPretrain训练中文LLaMA大规模语言模型 四、基于斯坦福Alpaca训练中文对话大模型BELLE 五、 清华开源项目ChatGLM中文对话模型 六、基于LLaMA的开源中文语言模型…

ChatGPT 开源了第一款插件,都来学习一下源码吧!

3 月 23 日&#xff0c;OpenAI 又投出了一枚重磅炸弹&#xff1a;为 ChatGPT 推出插件系统&#xff01; 此举意味着 ChatGPT 将迎来“APP Store”时刻&#xff0c;也就是围绕它的能力&#xff0c;形成一个开发者生态&#xff0c;打造出基于 AI 的“操作系统”&#xff01; 插…

开源版ChatGPT,30分钟训完,性能堪比GPT3.5!

转自&#xff1a;新智元 话说&#xff0c;ChatGPT 开源&#xff0c;是一件好事吗&#xff1f; 此前&#xff0c;OpenAI 不 Open 的事件&#xff0c;已经引发了坊间的诸多争议。 光放出基准和测试结果&#xff0c;不提供训练数据、成本、方法&#xff0c;是真的要「赢家通吃」了…

2023-02-18 什么是chatGPT?如何使用chatGPT?chatGPT可以胜任人类当前哪些工作?.什么是openAI?chatGPT的使用示例

文章目录 1.什么是chatGPT?2.如何使用chatGPT?3.chatGPT可以胜任人类当前哪些工作?4.什么是openAI?5,使用示例一:旅游攻略6.使用示例二:AI绘画 1.什么是chatGPT? chatGPT本质上是一个应用在对话场景中的语言模型,它是基于GPT3.5(Generative Pre-trained Transformer,是指…

人类与ChatGPT:互动中的共同进步

一、ChatGPT的发展历程 1. GPT模型 ChatGPT是由OpenAI推出的一款聊天机器人&#xff0c;其核心技术基于GPT模型。GPT模型&#xff08;Generative Pre-training Transformer&#xff09;是一种基于Transformer结构的预训练语言模型。它在大规模的文本语料库上进行无监督的预训…

零基础解读ChatGPT:对人类未来工作是威胁还是帮助?

摘要&#xff1a;火到现在的ChatGPT到底是什么&#xff1f;它背后有哪些技术&#xff1f;对于我们的工作和生活会有啥影响&#xff1f;快来一起了解吧~ 本文分享自华为云社区《零基础解读ChatGPT&#xff1a;对人类未来工作是威胁还是帮助&#xff1f;》&#xff0c;作者&#…

ChatGPT 是一种受到广泛关注的人工智能技术,它具备生成自然语言的能力,能够完成一些简单的文本生成、对话交互等任务。随着人工智能技术的不断发展,有人开始质疑 ChatGPT 是否能取代程序员,推动

ChatGPT 是一种受到广泛关注的人工智能技术&#xff0c;它具备生成自然语言的能力&#xff0c;能够完成一些简单的文本生成、对话交互等任务。随着人工智能技术的不断发展&#xff0c;有人开始质疑 ChatGPT 是否能取代程序员&#xff0c;推动着人类的智能化进程。本文将围绕“C…