80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
#encoding = utf8
|
|
import time
|
|
|
|
import librosa
|
|
import numpy as np
|
|
import requests
|
|
import resampy
|
|
import soundfile as sf
|
|
|
|
|
|
def download_tts(url):
|
|
file_name = url[3:]
|
|
print(file_name)
|
|
download_url = url
|
|
print('download tts', download_url)
|
|
resp = requests.get(download_url)
|
|
with open('./audio/mp3/' + file_name, 'wb') as mp3:
|
|
mp3.write(resp.content)
|
|
|
|
from pydub import AudioSegment
|
|
sound = AudioSegment.from_mp3('./audio/mp3/' + file_name)
|
|
sound.export('./audio/wav/' + file_name + '.wav', format="wav")
|
|
|
|
|
|
def __create_bytes_stream(byte_stream):
|
|
stream, sample_rate = sf.read(byte_stream) # [T*sample_rate,] float64
|
|
print(f'[INFO]tts audio stream {sample_rate}: {stream.shape}')
|
|
stream = stream.astype(np.float32)
|
|
|
|
if stream.ndim > 1:
|
|
print(f'[WARN] audio has {stream.shape[1]} channels, only use the first.')
|
|
stream = stream[:, 0]
|
|
|
|
if sample_rate != 16000 and stream.shape[0] > 0:
|
|
print(f'[WARN] audio sample rate is {sample_rate}, resampling into {16000}.')
|
|
stream = resampy.resample(x=stream, sr_orig=sample_rate, sr_new=16000)
|
|
|
|
return stream
|
|
|
|
|
|
def main():
|
|
import aiohttp
|
|
import asyncio
|
|
from io import BytesIO
|
|
|
|
async def fetch_audio():
|
|
url = "http://localhost:8082/v1/audio/speech"
|
|
data = {
|
|
"model": "tts-1",
|
|
"input": "写了一个高性能tts(文本转声音)工具,5千字仅需5秒,免费使用",
|
|
"voice": "alloy",
|
|
"speed": 1.0
|
|
}
|
|
|
|
async with aiohttp.ClientSession() as session:
|
|
async with session.post(url, json=data) as response:
|
|
if response.status == 200:
|
|
audio_data = BytesIO(await response.read())
|
|
audio_stream = __create_bytes_stream(audio_data)
|
|
|
|
# 保存为新的音频文件
|
|
sf.write("output_audio.wav", audio_stream, 16000)
|
|
print("Audio data received and saved to output_audio.wav")
|
|
else:
|
|
print("Error:", response.status, await response.text())
|
|
|
|
# Run the async function
|
|
asyncio.run(fetch_audio())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
t = time.time()
|
|
main()
|
|
print(f'-------tts time:{time.time() - t:.4f}s')
|
|
except KeyboardInterrupt:
|
|
print("\nCaught Ctrl + C. Exiting")
|
|
except Exception as e:
|
|
print(e)
|