上星期ChatGPT发布,每个人都在测验惊人的作业。我也开端玩它,并想测验怎么运用AWSAI 服务进行集成,成果是:一点问题没有!

在这篇文章中,我将逐步解释我是怎么创立这个项意图,以便您也能够这样做!

最重要的是,您无需成为AI专家即可创立此内容!

我假定您现已知道 ChatGPT 是什么,而且有一个帐户能够运用 AWS。假如您不知道 ChatGPT 是什么,请在此处检查 ChatGPT 是什么以及怎么自己测验。能够在此处找到此项意图完整代码。

开源项目地址

Robertgv/chatgpt-aws

ChatGPT + AWS

上星期ChatGPT发布,每个人都在测验惊人的作业。我也开端玩它,并想测验怎么运用AWSAI 服务进行集成,成果是 AWSome!

详细过程

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

我将这个项目分为 8 个过程:

  1. 录制音频并将其保存为 WAV 格局
  2. 将音频文件上传到亚马逊 S3
  3. 运用 Amazon Transcribe 转录并辨认保存在 S3 中的音频的内容
  4. Amazon Transcribe 将转录成果保存在 Amazon S3 中
  5. 将转录发送到 ChatGPT
  6. 从 ChatGPT 接纳文本答案并提交Amazon Polly
  7. 运用 Amazon Polly 将检测到的言语将文本转换为音频,并以 MP3 格局下载音频
  8. 播映应对音频文件

在开端之前,咱们需求界说您需求在以下代码中创立并稍后替换的常规参数。后续过程将解释此凭据的创立。

# ChatGPT params
chatGPT_session_token = "<SESSION-TOKEN>"
# AWS params
aws_access_key_id = "<ACCESS-KEY-ID>"
aws_secret_access_key = "<SECRET-ACCESS-KEY>"
aws_default_region = "<AWS-REGION>"
aws_default_s3_bucket = "<S3-BUCKET>"
# Voice recording params
samplerate = 48000
duration = 4 #seconds

1.录制音频并将其保存为WAV格局

首先,咱们需求录制音频,咱们将在其中提出咱们期望 ChatGPT 回答的问题。为此,咱们将运用声响硬件设备。保证您在操作系统的默许配置中挑选了正确的麦克风。 在这种情况下,它将录制语音的时刻是 4 秒。 假如您想增加或减少此刻刻,只需修正参数持续时刻的值。
该脚本会将音频保存在当前作业目录中名为audio的文件夹中。假如此文件夹不存在,它将运用os模块创立它。

def record_audio(duration, filename):
    print("[INFO] Start of the recording")
    mydata = sd.rec(int(samplerate * duration), samplerate=samplerate,channels=1, blocking=True)
    print("[INFO] End of the recording")
    sd.wait()
    sf.write(filename, mydata, samplerate)
    print(f"[INFO] Recording saved on: {filename}")
#Check if folder "audios" exists in current directory, if not then create it
if not os.path.exists("audio"):
    os.makedirs("audio")
# Create a unique file name using UUID
filename = f'audio/{uuid.uuid4()}.wav'
record_audio(duration, filename)

2. 将音频文件上传到亚马逊 S3

在此过程中,首先咱们需求创立一个Amazon S3 存储桶。为此,咱们转到AWS操控台并查找服务Amazon S3。然后单击创立存储桶

咱们需求输入存储桶的称号(存储桶称号在一切 AWS 区域的一切 AWS 账户中有必要是仅有的),然后挑选 AWS 区域。

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

其他的参数咱们能够将它们保存为默许值。最终,单击页面底部的创立存储桶

在参数部分,咱们需求从一开端就将此值替换为存储桶称号和所选区域:

aws_default_region = "<AWS-REGION>"
aws_default_s3_bucket = "<S3-BUCKET>"

下一步是创立一个新用户,咱们将运用该用户运用boto3 拜访此 S3存储桶。Boto3是 Python 的 Amazon Web Services (AWS) Software Development Kit (SDK),它允许 Python 开发人员编写运用 Amazon S3 和 Amazon EC2 等服务的软件。

要创立新用户,咱们在 AWS 操控台上查找IAM。然后单击 “拜访办理”下左侧菜单上的 “用户”:

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

单击右上角的增加用户。咱们需求供给一个用户名,然后单击拜访键 – 编程拜访复选框。


如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

然后单击下一步 :权限。在此处单击“直接附加现有战略”,然后单击“创立战略”。

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

在这里我想提一下,咱们能够挑选名为AmazonS3FullAccess的战略,它能够作业,但这违背了最小特权权限的原则。在这种情况下,咱们将只供给对咱们之前创立的存储桶的拜访权限。

创立战略页面上,单击挑选服务并查找S3并单击它。然后在 “操作” 上单击选项:

  • 列表桶
  • 获取目标
  • 删去目标
  • 放置目标

资源上单击特定,然后在存储桶上单击增加ARN,输入咱们之前创立的存储桶称号,然后单击增加。在目标上,还要单击增加 ARN并输入之前创立的存储桶称号,在目标称号上单击复选框任意

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

然后单击下一步:标签下一步:检查。最终,为新战略命名,然后单击“创立战略”。

创立战略后,返回到用户页面的创立并查找创立的新战略。假如未出现,请单击刷新按钮。

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

然后单击下一步:标签下一步:检查。最终,检查一切正常,然后单击创立用户

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

鄙人一页上,咱们将取得拜访密钥 ID隐秘拜访密钥。保证保存它们(特别是隐秘拜访密钥)而且不要共享它们。在参数部分,咱们需求替换以下值:

aws_access_key_id = "<ACCESS-KEY-ID>"
aws_secret_access_key = "<SECRET-ACCESS-KEY>"

这样,咱们就有一个用户有权写入之前创立的 S3 存储桶。

# Connect to Amazon S3 using Boto3
def get_s3_client():
    return(boto3.client('s3', region_name=aws_default_region, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key))
def upload_file_to_s3(filename):
    s3_client = get_s3_client()
    try:
        with open(filename, "rb") as f: 
            s3_client.upload_fileobj(f, aws_default_s3_bucket, filename)
            print(f"[INFO] File has been uploaded successfully in the S3 bucket: '{aws_default_s3_bucket}'")
    except:
        raise ValueError(f"[ERROR] Error while uploading the file in the S3 bucket: '{aws_default_s3_bucket}'")
upload_file_to_s3(filename)

3-4. 运用亚马逊转录转录并检测保存在 S3 中的音频的言语

Amazon Transcribe是一项 AWS 人工智能 (AI) 服务,可让您轻松地将语音转换为文本。运用自动语音辨认 (ASR) 技能,您能够将 Amazon Transcribe 用于各种事务运用程序,包括转录依据语音的客户服务呼叫、在音频/视频内容上生成字幕以及对音频/视频内容进行(依据文本的)内容分析。

为了能够将Amazon Transcribe与在上一步中创立的 IAM用户一起运用,咱们需求经过IAM 战略供给对它的拜访权限。

为此,咱们需求转到AWS操控台中的IAM,单击左侧菜单中的用户,然后单击之前创立的用户。 单击“增加权限”,然后单击 “直接附加现有战略”。查找AmazonTranscribe并 单击AmazonTranscribeFullAccess复选框。

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

单击“下一步:检查增加权限”。

此刻,此用户应附加 2 个战略:

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

增加此额定权限后,**您无需修正/更新拜访密钥 ID隐秘拜访密钥

鄙人面的 python 代码中,咱们经过boto3软件包运用 Amazon 转录将音频中录制的语音转录为文本。Amazon Transcribe 还会检测音频中运用的言语。

在这里,您能够在 boto3 文档中阅读有关转录服务的一切文档。

转录保存在 Amazon S3 的 JSON 文件中。您能够挑选将成绩单保存在您自己的 Amazon S3 存储桶中,也能够让 Amazon Transcribe 运用安全的默许存储桶。就我而言,我挑选拥有的 Amazon S3 存储桶上的默许选项。 假如咱们挑选默许选项,则在作业到期(90 天)时将删去成绩单。假如咱们想将成绩单保存在此到期日期之后,则有必要下载它。

# Generate UUID for the job id
job_id = str(uuid.uuid4())
# Connect to Amazon Transcribe using Boto3
def get_transcribe_client():
    return(boto3.client('transcribe', region_name=aws_default_region, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key))
def get_text_from_audi(filename):
    transcribe = get_transcribe_client()
    print("[INFO] Starting transcription of the audio to text")
    transcribe.start_transcription_job(TranscriptionJobName=job_id, Media={'MediaFileUri': f"https://{aws_default_s3_bucket}.s3.{aws_default_region}.amazonaws.com/{filename}"}, MediaFormat='wav', IdentifyLanguage=True)
    print("[INFO] Transcribing text: *",end="")
    while True:
        status = transcribe.get_transcription_job(TranscriptionJobName=job_id)
        if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
            break
        print("*",end='')
        time.sleep(2)
    print("") #End of line after loading bar
    if status['TranscriptionJob']['TranscriptionJobStatus'] == 'COMPLETED':
        response = urllib.request.urlopen(status['TranscriptionJob']['Transcript']['TranscriptFileUri'])
        data = json.loads(response.read())
        language_detected = data['results']['language_identification'][0]['code']
        transcript = data['results']['transcripts'][0]['transcript']
        print(f"[INFO] Transcription completed!")
        print(f"[INFO] Transcript language: {language_detected}")
        print(f"[INFO] Transcript text: {transcript}")
        return(transcript, language_detected)
    else:
        raise ValueError("[ERROR] The process to convert audio to text using Amazon Transcribe has failed.")
transcript, language_detected = get_text_from_audi(filename)

5. 将转录发送到 ChatGPT

收到来自 Amazon Transcribe 的成绩单后,咱们需求将其发送到 ChatGPT。为此,我正在运用revChatGPT包。要运用此软件包,咱们需求向 ChatGPT 进行身份验证,这能够运用用户名和暗码 或运用 session_token来完结。就我而言,因为我运用的是谷歌OAuth身份验证办法,所以我将运用session_token

要获取会话令牌,咱们需求登录ChatGPT,然后单击F12或右键单击并检查。然后查找“运用程序”选项卡,并在左侧菜单中查找Cookie。挑选网站chat.openai.com,然后查找称号为 __Secure-next-auth.session-token的 Cookie,并仿制此 Cookie 的值。

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

在一开端的参数部分中,咱们需求将此值替换为您拥有的会话令牌值:

chatGPT_session_token = "<SESSION-TOKEN>"

假如您想运用电子邮件暗码作为身份验证办法,您能够在此处检查有关怎么执行此操作的过程。

完结此操作后,咱们应该能够运用 Python 连接到 ChatGPT。

def get_gpt_answer(prompt):
    print(f"[INFO] Sending transcript to ChatGPT")
    config = {"email": "<API-KEY>","session_token": chatGPT_session_token}
    chatbot = Chatbot(config, conversation_id=None)
    chatbot.refresh_session()
    response = chatbot.get_chat_response(prompt, output="text")["message"]
    print(f"[INFO] ChatGPT answer: {response}")
    return(response)
chatgpt_answer = get_gpt_answer(transcript)

6. 从 ChatGPT 接纳文本答案并删去冗余回复内容

一旦咱们从ChatGPT得到答案,咱们就会得到一个或多个回话文本。在这种情况下,我正在运用正则表达式函数来删去不必内容。

在这里,您还能够增加自己的规矩,了解怎么从 ChatGPT 中过滤或清除答案。


def clean_audio_text(text):
    # Clean the code chuncks from the audio using regex
    result = re.sub(r"```
[^\S\r\n]*[a-z]*\n.*?\n
```", '', text, 0, re.DOTALL)
    return(result)

7. 运用 Amazon Polly 运用过程 3 中检测到的言语将文本转换为音频,并以 MP3 格局下载音频

Amazon Polly运用深度学习技能合成听起来自然的人类语音,因此咱们能够将文本转换为语音。

从 ChatGPT 清除答案后,咱们预备将其发送到Amazon Polly。

为了能够将 AmazonPolly用于之前创立的用户,咱们需求运用战略供给对它的拜访权限,就像咱们在上一步中运用Amazon Trancri所做的那样。

为此,咱们需求转到AWS操控台中的IAM,单击左侧菜单中的用户,然后单击之前创立的用户。 然后单击“增加权限”,然后单击 “直接附加现有战略”。查找AmazonPolly,然后单击AmazonPollyFullAccess复选框。

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

单击“下一步:检查增加权限”。

此刻,此用户应附加 3 个战略:

如何使用 AWS 和 ChatGPT 创建最智能的语音应答小助手

Amazon Polly支撑多种言语和不同的性别。在这种情况下,我供给的代码预界说了 3 种言语:英语、西班牙语和加泰罗尼亚语。另外,请注意,关于每种言语,您能够依据国家/地区有不同的变体。例如,关于英语,咱们有en-US,en-GB,en-IN等。****

此处供给了一切可用言语和变体的完整列表。

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

def get_polly_client():
    return boto3.client('polly', region_name=aws_default_region, endpoint_url=f"https://polly.{aws_default_region}.amazonaws.com", aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
def generate_audio(polly, text, output_file, voice, format='mp3'):
    text = clean_audio_text(text)
    resp = polly.synthesize_speech(Engine='neural', OutputFormat=format, Text=text, VoiceId=voice)
    soundfile = open(output_file, 'wb')
    soundBytes = resp['AudioStream'].read()
    soundfile.write(soundBytes)
    soundfile.close()
    print(f"[INFO] Response audio saved in: {output_file}")
def get_speaker(language_detected):
    # 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)
    voice = ""
    if language_detected == "en-US":
        voice = "Joanna"
    elif language_detected == "en-GB":
        voice = "Amy"
    elif language_detected == "en-IN":
        voice = "Kajal"
    elif language_detected == "ca-ES":
        voice = "Arlet"
    elif language_detected == "es-ES":
        voice = "Lucia"
    elif language_detected == "es-MX":
        voice = "Mia"
    elif language_detected == "es-US":
        voice = "Lupe"
    else:
        voice = "Joanna"
        print(f"[WARNING] The language detected {language_detected} is not supported on this code. In this case the default voice is Joanna (en-US).")
    print(f"[INFO] Speaker selected: {voice}")
    return(voice)
polly = get_polly_client()
voice = get_speaker(language_detected)
output_file = f"audio/{job_id}.mp3"
generate_audio(polly, chatgpt_answer, output_file,voice=voice)

8.播映应对音频文件

最终,咱们只需求播映来自亚马逊波莉的音频成果。

依据操作系统或您运行此内容的位置,它或许无法正常作业。就我而言,当我在macOS中从终端运行功能speak_script(output_file) 时,它能够作业。假如您运用的是像Jupyter Notebook这样的笔记本,请运用speak_notebook(output_file) 函数。

def speak_notebook(output_file):
    print(f"[INFO] Start reproducing response audio")
    display(Audio(output_file, autoplay=True))
def speak_script(output_file):
    print(f"[INFO] Start reproducing response audio")
    return_code = subprocess.call(["afplay", output_file])
speak_script(output_file)

示例输出

假如咱们依照前面的一切过程进行操作,咱们应该预备好开端运用新的多言语虚拟助手。为了向您展现输出的外观,我录制了自己问 “什么是亚马逊网络服务?” ,您能够清楚地看到这正是 Amazon Transcribe 生成的成绩单,然后是 ChatGPT 供给的答案。

$ 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

记得点赞哦

我期望你喜欢它,就像我在构建和运用这些服务时相同。我认为这些最先进的技能有很多机会/潜力,当咱们将它们一起运用时,成果就是AWSome!


本文正在参与 人工智能创作者扶持计划