elebumm / RedditVideoMakerBot

Create Reddit Videos with just✨ one command ✨
GNU General Public License v3.0
6.65k stars 1.86k forks source link

[Bug]: TTS and TikTok Errors After Being Asked to Input #1735

Closed codeadvance closed 1 year ago

codeadvance commented 1 year ago

Describe the bug

Hi guysI am new to coding and am trying to run the python code. I am not to sure what to do with the following code;

Error: Code: 1, reason: probably the aid value isn't correct, message: Couldn't load speech. Try again. │ │ Config: {'allow_nsfw': False, 'theme': 'dark', 'times_to_run': 1, 'opacity': 0.9, 'storymode': False, │ │ 'storymodemethod': 1, 'storymode_max_length': 1000, 'resolution_w': 1080, 'resolution_h': 1920, 'zoom': 1.0, │ │ 'background': {'background_video': 'minecraft', 'background_audio': 'lofi', 'background_audio_volume': 0.15, │ │ 'enable_extra_audio': False, 'background_thumbnail': False, 'background_thumbnail_font_family': 'arial', │ │ 'background_thumbnail_font_size': 96, 'background_thumbnail_font_color': '255,255,255'}, 'tts': {'voice_choice': │ │ 'tiktok', 'random_voice': True, 'elevenlabs_voice_name': 'Bella', 'elevenlabs_api_key': 'REDACTED', 'aws_polly_voice': │ │ 'Matthew', 'streamlabs_polly_voice': 'Matthew', 'tiktok_voice': 'en_us_001', 'tiktok_sessionid': 'REDACTED', │ │ 'python_voice': '1', 'py_voice_num': 'u', 'silence_duration': 0.3, 'no_emojis': False}}

Traceback (most recent call last): File "/Users/obossmon/Desktop/RedditVideoMakerBot/main.py", line 136, in raise err File "/Users/obossmon/Desktop/RedditVideoMakerBot/main.py", line 118, in run_many(config["settings"]["times_to_run"]) File "/Users/obossmon/Desktop/RedditVideoMakerBot/main.py", line 73, in run_many main() File "/Users/obossmon/Desktop/RedditVideoMakerBot/main.py", line 55, in main length, number_of_comments = save_text_to_mp3(reddit_object) File "/Users/obossmon/Desktop/RedditVideoMakerBot/video_creation/voices.py", line 53, in save_text_to_mp3 return text_to_mp3.run() File "/Users/obossmon/Desktop/RedditVideoMakerBot/TTS/engine_wrapper.py", line 77, in run self.call_tts("title", process_text(self.reddit_object["thread_title"])) File "/Users/obossmon/Desktop/RedditVideoMakerBot/TTS/engine_wrapper.py", line 154, in call_tts self.tts_module.run( File "/Users/obossmon/Desktop/RedditVideoMakerBot/TTS/TikTok.py", line 111, in run raise TikTokTTSException(status_code, data["message"]) TTS.TikTok.TikTokTTSException: Code: 1, reason: probably the aid value isn't correct, message: Couldn't load speech. Try again.

Screenshot 2023-07-02 at 2 41 14 PM

Reproduction Steps

I am using Mac M1 Max to run the code and I am following the instruction on "READ ME" script. I don't know how to set up TTS (text to speech) and I have encountered this error as following above. I am not sure how to make the errors go away as I am still new to the programming and there is no specific tutorials on Text to speech section. I may have miss other parts that have caused the error. I appreciate all helps. I want to make it work as I am excited to learn a new skill on my own.

Screenshot 2023-07-02 at 2 41 14 PM

Expected behavior

I expected to have free AI human like voice to read the Reddit post with background videos and lo-fi music.

Screenshots

Screenshot 2023-07-02 at 2 41 14 PM

System Information

Operating System : MAC Python version :3.10.11 64-bit

Screenshot 2023-07-02 at 2 57 24 PM

App version / Branch : [e.g. latest, V2.0, master, develop]

Checklist

Additional Context

No response

github-actions[bot] commented 1 year ago

This issue is stale because it has been open 7 days with no activity. Remove stale label or comment, or this will be closed in 10 days.

github-actions[bot] commented 1 year ago

Issue closed due to being stale. Please reopen if issue persists in latest version.

RedactedIV commented 12 months ago

Try replacing the code for Tiktok.py with this.

This new code was written by @joshholly only with line 6 being edited, since it was also causing an issue for me. This modified code seems to work no problems tho

# documentation for tiktok api: https://github.com/oscie57/tiktok-voice/wiki

import base64
import random
import time
from typing import Optional, Final
import requests

from utils import settings

__all__ = ["TikTok", "TikTokTTSException"]

disney_voices: Final[tuple] = (
    "en_us_ghostface",  # Ghost Face
    "en_us_chewbacca",  # Chewbacca
    "en_us_c3po",  # C3PO
    "en_us_stitch",  # Stitch
    "en_us_stormtrooper",  # Stormtrooper
    "en_us_rocket",  # Rocket
    "en_female_madam_leota",  # Madame Leota
    "en_male_ghosthost",  # Ghost Host
    "en_male_pirate",  # pirate
)

eng_voices: Final[tuple] = (
    "en_au_001",  # English AU - Female
    "en_au_002",  # English AU - Male
    "en_uk_001",  # English UK - Male 1
    "en_uk_003",  # English UK - Male 2
    "en_us_001",  # English US - Female (Int. 1)
    "en_us_002",  # English US - Female (Int. 2)
    "en_us_006",  # English US - Male 1
    "en_us_007",  # English US - Male 2
    "en_us_009",  # English US - Male 3
    "en_us_010",  # English US - Male 4
    "en_male_narration",  # Narrator
    "en_female_emotional",  # Peaceful
    "en_male_cody",  # Serious
)

non_eng_voices: Final[tuple] = (
    # Western European voices
    "fr_001",  # French - Male 1
    "fr_002",  # French - Male 2
    "de_001",  # German - Female
    "de_002",  # German - Male
    "es_002",  # Spanish - Male
    "it_male_m18",  # Italian - Male
    # South american voices
    "es_mx_002",  # Spanish MX - Male
    "br_001",  # Portuguese BR - Female 1
    "br_003",  # Portuguese BR - Female 2
    "br_004",  # Portuguese BR - Female 3
    "br_005",  # Portuguese BR - Male
    # asian voices
    "id_001",  # Indonesian - Female
    "jp_001",  # Japanese - Female 1
    "jp_003",  # Japanese - Female 2
    "jp_005",  # Japanese - Female 3
    "jp_006",  # Japanese - Male
    "kr_002",  # Korean - Male 1
    "kr_003",  # Korean - Female
    "kr_004",  # Korean - Male 2
)

vocals: Final[tuple] = (
    "en_female_f08_salut_damour",  # Alto
    "en_male_m03_lobby",  # Tenor
    "en_male_m03_sunshine_soon",  # Sunshine Soon
    "en_female_f08_warmy_breeze",  # Warmy Breeze
    "en_female_ht_f08_glorious",  # Glorious
    "en_male_sing_funny_it_goes_up",  # It Goes Up
    "en_male_m2_xhxs_m03_silly",  # Chipmunk
    "en_female_ht_f08_wonderful_world",  # Dramatic
)

class TikTok:
    """TikTok Text-to-Speech Wrapper"""

    def __init__(self):
        headers = {
            "User-Agent": "com.zhiliaoapp.musically/2022600030 (Linux; U; Android 7.1.2; es_ES; SM-G988N; "
            "Build/NRD90M;tt-ok/3.12.13.1)",
            "Cookie": f"sessionid={settings.config['settings']['tts']['tiktok_sessionid']}",
        }

        self.URI_BASE = (
            "https://tiktok-tts.weilnet.workers.dev/api/generation"
        )
        self.max_chars = 200

        self._session = requests.Session()
        # set the headers to the session, so we don't have to do it for every request
        self._session.headers = headers

    def run(self, text: str, filepath: str, random_voice: bool = False):
        if random_voice:
            voice = self.random_voice()
        else:
            # if tiktok_voice is not set in the config file, then use a random voice
            voice = settings.config["settings"]["tts"].get("tiktok_voice", None)

        # get the audio from the TikTok API
        data = self.get_voices(voice=voice, text=text)
        # check if there was an error in the request
        status_code = data["error"]

        # decode data from base64 to binary
        try:
            raw_voices = data["data"]
        except:
            print(
                "The TikTok TTS returned an invalid response. Please try again later, and report this bug."
            )
            raise TikTokTTSException(0, "Invalid response")
        decoded_voices = base64.b64decode(raw_voices)

        # write voices to specified filepath
        with open(filepath, "wb") as out:
            out.write(decoded_voices)

    def get_voices(self, text: str, voice: Optional[str] = None) -> dict:
        """If voice is not passed, the API will try to use the most fitting voice"""
        # sanitize text
        text = text.replace("+", "plus").replace("&", "and").replace("r/", "")

        # prepare url request
        params = {"text": text,"voice": voice}
        if voice is not None:
            params["voice"] = voice

        # send request
        try:
            response = self._session.post(self.URI_BASE, json=params)
        except ConnectionError:
            time.sleep(random.randrange(1, 7))
            response = self._session.post(self.URI_BASE, json=params)

        return response.json()

    @staticmethod
    def random_voice() -> str:
        return random.choice(eng_voices)

class TikTokTTSException(Exception):
    def __init__(self, status_code, message):
        self.status_code = status_code
        self.message = message
        super().__init__(self.message)

    def __str__(self):
        return f"Code: {self.status_code}, Message: {self.message}"
rmoralesuscs commented 11 months ago

Thanks for sharing these changes @RedactedIV and also thanks to the author: @joshholly. this worked for me

amethode commented 9 months ago

@RedactedIV sorry but I got this error: Traceback (most recent call last): File "/home/torneighdo/Documents/RedditVideoMakerBot/main.py", line 132, in raise err File "/home/torneighdo/Documents/RedditVideoMakerBot/main.py", line 114, in run_many(config["settings"]["times_to_run"]) File "/home/torneighdo/Documents/RedditVideoMakerBot/main.py", line 69, in run_many main() File "/home/torneighdo/Documents/RedditVideoMakerBot/main.py", line 51, in main length, number_of_comments = save_text_to_mp3(reddit_object) File "/home/torneighdo/Documents/RedditVideoMakerBot/video_creation/voices.py", line 49, in save_text_to_mp3 return text_to_mp3.run() File "/home/torneighdo/Documents/RedditVideoMakerBot/TTS/engine_wrapper.py", line 102, in run self.call_tts(f"{idx}", process_text(comment["comment_body"])) File "/home/torneighdo/Documents/RedditVideoMakerBot/TTS/engine_wrapper.py", line 149, in call_tts self.tts_module.run( File "/home/torneighdo/Documents/RedditVideoMakerBot/TTS/TikTok.py", line 117, in run decoded_voices = base64.b64decode(raw_voices) File "/home/torneighdo/.pyenv/versions/3.10.2/lib/python3.10/base64.py", line 80, in b64decode s = _bytes_from_decode_data(s) File "/home/torneighdo/.pyenv/versions/3.10.2/lib/python3.10/base64.py", line 45, in _bytes_from_decode_data raise TypeError("argument should be a bytes-like object or ASCII " TypeError: argument should be a bytes-like object or ASCII string, not 'NoneType

khalid-121 commented 2 months ago

@RedactedIV I LOVE U DUDE