Skip to content

Commit 8dbda5b

Browse files
committed
Fix for Japanese, logging and improved file giving
1 parent 368be2b commit 8dbda5b

File tree

3 files changed

+23
-24
lines changed

3 files changed

+23
-24
lines changed

pyproject.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "xtts-api-server"
7-
version = "0.2.5"
7+
version = "0.3.0"
88
authors = [
99
{ name="daswer123", email="daswerq123@gmail.com" },
1010
]
@@ -24,6 +24,8 @@ dependencies = [
2424
"torch",
2525
"torchaudio",
2626
"uvicorn",
27+
"cutlet",
28+
"fugashi[unidic-lite]",
2729
"tts"
2830
]
2931

xtts_api_server/server.py

+16-16
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from fastapi import FastAPI, HTTPException
33
from fastapi.middleware.cors import CORSMiddleware
44
from fastapi.responses import FileResponse
5-
from fastapi.responses import StreamingResponse
65

76
from pydantic import BaseModel
87
import uvicorn
@@ -24,7 +23,7 @@
2423
XTTS = TTSWrapper(OUTPUT_FOLDER,SPEAKER_FOLDER)
2524

2625
# Load model
27-
logger.info("The model starts to load, wait about a minute")
26+
logger.info("The model starts to load,wait until it loads")
2827
XTTS.load_model()
2928

3029
# Add CORS middleware
@@ -81,6 +80,7 @@ def get_sample(file_name: str):
8180
if os.path.isfile(file_path):
8281
return FileResponse(file_path, media_type="audio/wav")
8382
else:
83+
logger.error("File not found")
8484
raise HTTPException(status_code=404, detail="File not found")
8585

8686
@app.post("/set_output/")
@@ -89,6 +89,7 @@ def set_output(output_req: OutputFolderRequest):
8989
XTTS.set_out_folder(output_req.output_folder)
9090
return {"message": f"Output folder set to {output_req.output_folder}"}
9191
except ValueError as e:
92+
logger.error(e)
9293
raise HTTPException(status_code=400, detail=str(e))
9394

9495
@app.post("/set_speaker_folder/")
@@ -97,6 +98,7 @@ def set_speaker_folder(speaker_req: SpeakerFolderRequest):
9798
XTTS.set_speaker_folder(speaker_req.speaker_folder)
9899
return {"message": f"Speaker folder set to {speaker_req.speaker_folder}"}
99100
except ValueError as e:
101+
logger.error(e)
100102
raise HTTPException(status_code=400, detail=str(e))
101103

102104
@app.post("/tts_to_audio/")
@@ -114,19 +116,16 @@ async def tts_to_audio(request: SynthesisRequest):
114116
language=request.language.lower()
115117
)
116118

117-
def iterfile():
118-
with open(output_file_path, mode="rb") as file_like: # read the file as stream
119-
yield from file_like
120-
121-
response = StreamingResponse(iterfile(), media_type='audio/wav')
122-
123-
# Set content disposition header to prompt download with proper filename
124-
response.headers["Content-Disposition"] = "attachment; filename=output.wav"
125-
126-
return response
119+
# Return the file in the response
120+
return FileResponse(
121+
path=output_file_path,
122+
media_type='audio/wav',
123+
filename="output.wav",
124+
)
127125

128126
except Exception as e:
129-
raise HTTPException(status_code=500, detail=f"An eldritch error has occurred: {str(e)}")
127+
logger.error(e)
128+
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
130129

131130

132131
@app.post("/tts_to_file/")
@@ -146,10 +145,11 @@ async def tts_to_file(request: SynthesisFileRequest):
146145
language=request.language.lower(),
147146
file_name_or_path=request.file_name_or_path # The user-provided path to save the file is used here.
148147
)
149-
return {"message": "The scroll of sound has been sealed and saved.", "output_path": output_file}
148+
return {"message": "The audio was successfully made and stored.", "output_path": output_file}
150149

151150
except Exception as e:
152-
raise HTTPException(status_code=500, detail=f"A sinister fault has slipped through: {str(e)}")
151+
logger.error(e)
152+
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
153153

154154
if __name__ == "__main__":
155-
uvicorn.run(app,host="0.0.0.0",port=8001)
155+
uvicorn.run(app,host="0.0.0.0",port=8002)

xtts_api_server/tts_funcs.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,13 @@ def create_directories(self):
4545
directories = [self.output_folder, self.speaker_folder]
4646

4747
for sanctuary in directories:
48-
# Ensure the path is absolute and normalized to prevent any sorcery!
48+
# List of folders to be checked for existence
4949
absolute_path = os.path.abspath(os.path.normpath(sanctuary))
5050

5151
if not os.path.exists(absolute_path):
52-
# If it does not exist in this dimension, then we must bring it into being!
52+
# If the folder does not exist, create it
5353
os.makedirs(absolute_path)
54-
print(f"The sacred space at {absolute_path} has been manifested!")
55-
else:
56-
# If it exists already, let us acknowledge its ancient presence.
57-
print(f"The venerable domain at {absolute_path} stands firm.")
54+
print(f"Folder in the path {absolute_path} has been created")
5855

5956
def set_speaker_folder(self, folder):
6057
if os.path.exists(folder) and os.path.isdir(folder):
@@ -80,7 +77,7 @@ def get_speakers(self):
8077
# Use os.path.splitext to split off the extension and take only the name
8178
speakers_list = [os.path.splitext(f)[0] for f in os.listdir(self.speaker_folder) if f.endswith('.wav')]
8279
return speakers_list
83-
80+
# Special format for SillyTavern
8481
def get_speakers_special(self):
8582
speakers_list = []
8683
BASE_URL = os.getenv('BASE_URL', '127.0.0.1:8020')

0 commit comments

Comments
 (0)