elebumm / RedditVideoMakerBot

Create Reddit Videos with just✨ one command ✨
GNU General Public License v3.0
6.49k stars 1.83k 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 9 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 9 months ago

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

amethode commented 6 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 days ago

@RedactedIV I LOVE U DUDE