Skip to content

Instantly share code, notes, and snippets.

@toriato
Created August 16, 2025 07:56
Show Gist options
  • Select an option

  • Save toriato/6f71a68716e0110884036aa14e8901b2 to your computer and use it in GitHub Desktop.

Select an option

Save toriato/6f71a68716e0110884036aa14e8901b2 to your computer and use it in GitHub Desktop.
TikTok TTS speakers
# use mitmproxy and rooted avd + cert-fixer to crack device_id and access_token
import asyncio
import json
import aiohttp
from pathlib import Path
from base64 import b64decode
from http.cookies import SimpleCookie
from urllib.parse import urlencode
script_dir = Path(__file__).parent
response_dir = script_dir / 'text_speech_responses'
semaphore = asyncio.Semaphore(4)
default_queries = {
'panel': 'speaking-voice',
'aid': '1180',
'access_key': '...',
'channel': 'googleplay',
'device_id': '...',
'device_type': 'sdk_gphone64_x86_64',
'device_platform': 'android',
'app_version': '41.2.3',
'sdk_version': '19.5.0'
}
# https://yashsdoshi.github.io/TikTok_Text_To_Speech
old_speakers = [
'en_us_001',
'en_us_006',
'en_us_007',
'en_us_009',
'en_us_010',
'en_uk_001',
'en_uk_003',
'en_au_001',
'en_au_002',
'fr_001',
'fr_002',
'de_001',
'de_002',
'es_002',
'es_mx_002',
'es_male_m3',
'es_female_f6',
'es_female_fp1',
'es_mx_female_supermom',
'es_mx_male_transformer',
'br_001',
'br_003',
'br_004',
'br_005',
'id_001',
'jp_001',
'jp_003',
'jp_005',
'jp_006',
'kr_002',
'kr_004',
'kr_003',
'en_us_ghostface',
'en_us_chewbacca',
'en_us_c3po',
'en_us_stitch',
'en_us_stormtrooper',
'en_us_rocket',
'en_female_f08_salut_damour',
'en_male_m03_lobby',
'en_male_m03_sunshine_soon',
'en_female_f08_warmy_breeze',
'en_female_ht_f08_glorious',
'en_male_sing_funny_it_goes_up',
'en_male_m2_xhxs_m03_silly',
'en_female_ht_f08_wonderful_world'
]
async def get_categories(session: aiohttp.ClientSession):
params = urlencode(default_queries)
path = f'/effect/api/panel/info/v2?{params}'
async with semaphore:
async with session.get(path) as response:
result = await response.json()
return [
x['key']
for x in result['data']['category_list']
]
async def get_category(session: aiohttp.ClientSession, category: str):
params = urlencode({
**default_queries,
'category': category
})
path = f'/effect/api/category/effects/v2?{params}'
async with semaphore:
async with session.get(path) as response:
result = await response.json()
def parse_extra(raw: str):
return json.loads(raw)['speakerID']
speakers = [
parse_extra(x['extra'])
for x in result['data']['category_effects']['effects']
]
print(f'{len(speakers)} speakers in {category}')
return speakers
async def invoke(session: aiohttp.ClientSession, speaker: str, text: str):
wav_path = (response_dir / speaker).with_suffix('.wav')
if wav_path.exists():
print(f'skipping: {speaker}')
return
params = urlencode({
'aid': default_queries['aid'],
'text_speaker': speaker,
'req_text': text
})
path = f'/media/api/text/speech/invoke/?{params}'
async with semaphore:
async with session.post(path) as response:
result = await response.json()
print(f'invoked: {speaker}')
wav_path.write_bytes(
b64decode(result['data']['v_str'])
)
async def main():
async with aiohttp.ClientSession(
base_url='https://api22-normal-c-alisg.tiktokv.com'
) as session:
cookies = SimpleCookie()
cookies['sessionid'] = '...'
cookies['sessionid']['domain'] = '.tiktokv.com'
session.cookie_jar.update_cookies(cookies)
categories = await get_categories(session)
chunks = await asyncio.gather(*[
get_category(session, category)
for category in categories
])
chunks.append(old_speakers)
await asyncio.gather(*[
invoke(session, speaker, f'Hello! My name is {speaker}!')
for speakers in chunks
for speaker in speakers
])
if __name__ == '__main__':
asyncio.run(main())
# Generated on 2025-08-16
# Samples: https://drive.google.com/drive/folders/1ugJMEYcagGMOVOjkFt1QYC0KKuevyDNu?usp=drive_link
br_001
br_003
br_004
br_005
de_001
de_002
en_au_001
en_au_002
en_female_amelia_mars_bigtts
en_female_amie_mars_bigtts
en_female_amie
en_female_asmr_leah
en_female_betty
en_female_british_queen
en_female_doll
en_female_elsa_amanda_crystal
en_female_emotional
en_female_erika
en_female_f08_salut_damour
en_female_f08_warmy_breeze
en_female_food_amy
en_female_ghost
en_female_gloria
en_female_grandma
en_female_gypsy
en_female_happy_femalevoice
en_female_ht_f08_glorious
en_female_ht_f08_wonderful_world
en_female_joanne_mars_bigtts
en_female_kid_eddie
en_female_lauren_moon_bigtts
en_female_leah_mars_bigtts
en_female_lois_familyguy
en_female_makeup
en_female_meangirl
en_female_nadia_mars_bigtts
en_female_nara_moon_bigtts
en_female_pansino
en_female_pet_mariacp_pawtalk
en_female_product_darcie
en_female_product_elise
en_female_product_leah
en_female_richgirl
en_female_samc
en_female_shenna
en_female_sinong_conversation_wvae_bigtts
en_female_skye_mars_bigtts
en_female_soothing_mars_bigtts
en_female_werewolf
en_female_witch
en_female_zombie
en_male_adam_elf
en_male_adrian
en_male_artistic_layne
en_male_ashmagic
en_male_benjie_mars_bigtts
en_male_bill_mars_bigtts
en_male_bumbling_idiot
en_male_charlie_en_moon_bigtts
en_male_chris
en_male_cody
en_male_cooking_tim_savor
en_male_cowboy_mars_bigtts
en_male_cupid
en_male_david_gingerman
en_male_deadpool
en_male_drag_voice
en_male_dramaqueen_zachk
en_male_excited_mars_bigtts
en_male_funny
en_male_golden_monkey
en_male_grinch
en_male_irritable_police_officer
en_male_jarvis
en_male_jason_en_moon_bigtts
en_male_jason
en_male_jomboy
en_male_josh_mars_bigtts
en_male_m03_lobby
en_male_m03_sunshine_soon
en_male_m2_xhxs_m03_silly
en_male_M392_conversation_wvae_bigtts
en_male_maxwell
en_male_miki
en_male_narration
en_male_olaf_david_flurry
en_male_olantekkers
en_male_positive_british
en_male_santa_effect
en_male_santa_mars_bigtts
en_male_santa_narration
en_male_sing_funny_it_goes_up
en_male_tim_mars_bigtts
en_male_trevor
en_male_ukbutler
en_male_ukneighbor
en_male_valentino_mars_bigtts
en_male_venom
en_male_whispering_voice
en_male_whitney
en_male_will_clone2
en_male_wizard
en_uk_001
en_uk_003
en_us_001
en_us_002
en_us_006
en_us_007
en_us_009
en_us_010
en_us_c3po
en_us_chewbacca
en_us_ghostface
en_us_rocket
en_us_stitch
en_us_stormtrooper
es_002
es_female_f6
es_female_fp1
es_male_m3
es_mx_002
es_mx_female_supermom
es_mx_male_asmr
es_mx_male_transformer
fr_001
fr_002
ICL_en_female_301F_AmberM
ICL_en_female_304F_AmyP
ICL_en_female_306F_PheC
ICL_en_female_308F_AbigailT
ICL_en_female_309F_DaceyE
ICL_en_female_309F_KatieJ
ICL_en_female_312F_StokieK
ICL_en_female_313F_Haikaa
ICL_en_female_314F_PheC
ICL_en_female_324F_AllegraD1
ICL_en_female_325F_AllegraD1
ICL_en_female_325F_AmyP
ICL_en_female_BillieE
ICL_en_female_confidentyoung
ICL_en_female_DaceyE03
ICL_en_female_GentleStoryteller
ICL_en_female_girlpower
ICL_en_female_ha_m3gan
ICL_en_male_303M_BrianM
ICL_en_male_305M_JamieTr
ICL_en_male_307M_MaxG
ICL_en_male_310M_CoreyK
ICL_en_male_311M_CoreyK
ICL_en_male_311M_ScottG
ICL_en_male_316M_KrisD
ICL_en_male_317M_BrianJW
ICL_en_male_318M_GlenL
ICL_en_male_319M_BrianM
ICL_en_male_320M_CoreyK
ICL_en_male_321M_GlenL
ICL_en_male_322M_CoreyK
ICL_en_male_323M_JonnyL
ICL_en_male_Britishtv
ICL_en_male_ChillDescriptive
ICL_en_male_conductor1
ICL_en_male_frosty1
ICL_en_male_grinch1
ICL_en_male_ha_chucky
ICL_en_male_ha_dracula
ICL_en_male_ha_ghostface2
ICL_en_male_ha_jigsaw
ICL_en_male_ha_penny
ICL_en_male_InspirationalSpeech
ICL_en_male_JSBrianM
ICL_en_male_kevin1
ICL_en_male_MaleFashionTutorial
ICL_en_male_MCPhilosopher
ICL_en_male_oogie1
ICL_en_male_rapvoice_AdamB
Butler
ICL_es_female_tt_AzulB
ICL_es_female_tt_MarianaF
ICL_es_female_tt_RosaW
ICL_es_female_tt_Vivi
ICL_es_male_tt_DiegoAT
ICL_es_male_tt_EdgarRu
ICL_es_male_tt_EmanuelA
ICL_es_male_tt_GerardoFCP
ICL_es_male_tt_GerardoQ
ICL_es_male_tt_JonnieVv
ICL_es_male_tt_JuanJ
ICL_es_male_tt_JuanZ
id_001
jp_001
jp_003
jp_005
jp_006
kr_002
kr_003
kr_004
zh_male_sunwukong_clone2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment