Полли скачивает mp3 как int?Попытка поставить его на S3 с помощью лямбды - PullRequest
0 голосов
/ 31 мая 2019

Я начинающий с Python. Попытка выяснить, что не так с Полли, поскольку, похоже, она не выводит действительный mp3.

Я свободно слежу за этими уроками: 1 2

но так как я не объединяю какие-либо файлы из-за ограничения символов, я не думаю, что мне нужно использовать Audiosegment или ffmpeg, верно?

Вот мой код:

import hashlib
import json
import tempfile
import praw, boto3
import os
import random
import time

polly = boto3.client('polly')
s3 = boto3.client('s3')
s3r = boto3.resource('s3')

DEFAULT_VOICE = os.getenv("DEFAULT_VOICE", "Celine")
SAMPLE_RATE = os.getenv("SAMPLE_RATE", "8000")
BUCKET_NAME = os.getenv("BUCKET_NAME", "pollybotreddit")
FILE_FORMAT = os.getenv("FILE_FORMAT", "mp3")

def build_sound(content, voice = 'Justin', SampleRate = SAMPLE_RATE):
    for text in content:
        resp = polly.synthesize_speech(
            OutputFormat = "mp3",
            Text = text,
            TextType = "text",
            VoiceId = voice
        )
    with open('test.mp3' , 'wb') as f:
        sound = f.write(resp['AudioStream'].read())
    return sound

def lambda_handler(event, content):
    slashr = event.get('subreddit')
    voice = event.get('voice', 'Joanna')
    if not slashr:
        raise ValueError("Bad Request: Not a subreddit")

    reddit = praw.Reddit('bot1')
    sub = reddit.subreddit(slashr)
    titles = []
    for submission in sub.hot(limit=5):
        if not submission.stickied:
            titles.append(submission.title)
    article = random.choice(titles)

    sound_data = build_sound(article, voice=voice)
    final = sound_data + '.mp3'


    s3.put_object(Bucket=BUCKET_NAME, ACL='public-read', Body=final, Key=article)

    item = {
        'subreddit': slashr,
        's3': "{}/{}/{}".format(s3.meta.endpoint_url, BUCKET_NAME, article)
        }
    return item

lambda_handler({'subreddit':"politics"}, None)

ошибка дает мне это:

  File "pollybot.py", line 91, in <module>
    lambda_handler({'subreddit':"politics"}, None)
  File "pollybot.py", line 79, in lambda_handler
    final = sound_data + '.mp3'
TypeError: unsupported operand type(s) for +: 'int' and 'str'

и если я достану

final = sound_data + '.mp3'

Вывод Полли все еще является целым, а не объектом File, поэтому он дает мне это

botocore.exceptions.ParamValidationError: Parameter validation failed:
Invalid type for parameter Body, value: 3493, type: <class 'int'>, valid types: <class 'bytes'>, <class 'bytearray'>, file-like object

Любая помощь? Заранее спасибо.

1 Ответ

0 голосов
/ 01 июня 2019

Благодаря @Daniel Roseman у меня сработал следующий блок кода:

def build_sound(content, voice = 'Justin', SampleRate = SAMPLE_RATE):
    for text in content:
        resp = polly.synthesize_speech(
            OutputFormat = "mp3",
            Text = text,
            TextType = "text",
            VoiceId = voice
        )
    filetospeech = resp['AudioStream'].read()
    return filetospeech
...