123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- import pyttsx3
- import requests
- from openai import OpenAI
- import openai
- import random
- import os
- import time
- import json
- import threading
- from itertools import chain
- from gtts import gTTS
- import os
- client = OpenAI()
- def txt_to_speach(text):
-
- text_list = text.replace(" ","").replace(",",",").split("。")
- filename = f"static/tts/mp3/output{random.randint(1,25)}.mp3"
- filenames = []
- text_list = [item.split(',') if len(item) > 30 else [item] for item in text_list ]
-
- text_list = list(chain.from_iterable(text_list ))
-
-
- threads = []
-
- for i,text_split in enumerate(text_list):
- text_split = text_split.strip()
-
-
- if not text_split:
- continue
- t = threading.Thread(target=text_split_to_text, args=(text_split,i,filename))
-
- threads.append(t)
- filenames.append(f"/home/mia/101/{filename}-{i}.mp3")
- print(filenames)
-
- for t in threads:
- t.start()
-
- for t in threads:
- t.join()
- merge_audio_files(filenames, f"/home/mia/101/{filename}")
- return filename,text_list
- def text_split_to_text(text_split,i,filename):
-
- response = client.audio.speech.create(
- model="tts-1",
- voice="nova",
- input=text_split
- )
- filename_tmp = f"/home/mia/101/{filename}-{i}.mp3"
- response.stream_to_file(filename_tmp)
- import subprocess
- from pydub import AudioSegment
- from moviepy.editor import VideoFileClip, AudioFileClip, concatenate_videoclips
- def merge_audio_files(files, output_file):
-
- cmd = ['ffmpeg', '-i', 'concat:' + '|'.join(files), '-c', 'copy', '-y',output_file]
-
- subprocess.run(cmd)
-
- for filename in files:
- os.remove(filename)
-
-
-
-
-
-
-
- def download_voice(text,voice="zh-TW-HsiaoChenNeural", pronunciations=None):
- output_url = f"static/tts/mp/output{random.randint(1,25)}.mp3"
- output = "/home/mia/101/" + output_url
- my_data = {
- "voice": voice,
- "content": [str(text)]
-
-
-
-
-
-
- }
- headers = {
-
- "Authorization":"61ddf2a47cdd42548671be21ccdcf285",
- "X-User-ID":'HEQLQR1WgpYtN0SEyKoWBsLiZXX2',
- "Content-Type": "application/json"
- }
- start_time = time.time()
-
- r = requests.post('https://play.ht/api/v1/convert',headers=headers,data=json.dumps(my_data))
- c1 = r.json()
- print(c1)
- c1 = r.json()['transcriptionId']
-
- time.sleep(len(text))
- success_flag = False
- r =''
-
- while True:
- r = requests.post('https://play.ht/api/v1/convert',headers=headers,data=json.dumps(my_data))
- c1 = r.json()['transcriptionId']
- print(f"{text}:{c1}")
-
- counter = 0
- while True:
- r = requests.get('https://play.ht/api/v1/articleStatus?transcriptionId=%s'%c1, headers=headers)
- if 'json' not in r.headers.get('content-type') or r.json()['converted'] == False:
- print(f"audio {c1} is not ready.")
-
- counter += 1
- if counter == 6:
- break
- else:
- success_flag = True
- break
-
- if success_flag:
- break
- else:
- print('redownload')
-
- file = requests.get(r.json()['audioUrl'])
- with open(output,"wb") as f:
- for chunk in file.iter_content(chunk_size=1024):
- if chunk:
- f.write(chunk)
- end_time = time.time()
- execution_time = end_time - start_time
- print("reply time:", execution_time, "s")
- return output_url,execution_time
|