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_1 = text.replace(" ","").replace(",",",").split("。")
- 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 ))
- # 建立存放執行序的list(存放thread)
-
- 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) # 將程序放入threads
- 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):
- # 生成 ffmpeg 的命令
- cmd = ['ffmpeg', '-i', 'concat:' + '|'.join(files), '-c', 'copy', '-y',output_file]
- # 执行命令
- subprocess.run(cmd)
- # 刪除暫時生成的音頻文件
- for filename in files:
- os.remove(filename)
- # combined = AudioSegment.empty()
- # # 逐一載入每個音頻文件並合併
- # for file in files:
- # audio = AudioSegment.from_file(file, format="mp3")
- # combined += audio
- # # 將合併後的音頻保存為新文件
- # combined.export(output_file, format="mp3")
- 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)] #["你好,很高興認識你","喜歡","討厭"]
- # "ssml": string[]
- # "title": string, // Optional
- # "narrationStyle": string, // Optional
- # "globalSpeed": string, // Optional
- # "pronunciations": { key: string, value: string }[], // Optional
- # "trimSilence": boolean, // Optional
- }
- headers = {
- # 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36',
- "Authorization":"61ddf2a47cdd42548671be21ccdcf285",
- "X-User-ID":'HEQLQR1WgpYtN0SEyKoWBsLiZXX2',
- "Content-Type": "application/json"
- }
- start_time = time.time()
- # 將資料加入 POST 請求中
- 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']
- # print(c1)
- 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}")
- # time.sleep(0.5+(len(text)/4))
- 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.")
- # time.sleep(0.5)
- 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
|