Closed codeadvance closed 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.
Issue closed due to being stale. Please reopen if issue persists in latest version.
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}"
Thanks for sharing these changes @RedactedIV and also thanks to the author: @joshholly. this worked for me
@RedactedIV sorry but I got this error:
Traceback (most recent call last):
File "/home/torneighdo/Documents/RedditVideoMakerBot/main.py", line 132, in
@RedactedIV I LOVE U DUDE
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.
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.
Expected behavior
I expected to have free AI human like voice to read the Reddit post with background videos and lo-fi music.
Screenshots
System Information
Operating System : MAC Python version :3.10.11 64-bit
App version / Branch : [e.g. latest, V2.0, master, develop]
Checklist
Additional Context
No response