Spaces:
Runtime error
Runtime error
Check
Browse files- .gitattributes +1 -0
- .idea/.gitignore +8 -0
- .idea/inspectionProfiles/Project_Default.xml +118 -0
- .idea/inspectionProfiles/profiles_settings.xml +6 -0
- .idea/misc.xml +7 -0
- .idea/vcs.xml +6 -0
- app.py +119 -0
- arena_feedback.csv +8 -0
- compare_audio/1_male.wav +3 -0
- compare_audio/2_female.wav +3 -0
- compare_audio/f5_tts_1.wav +3 -0
- compare_audio/f5_tts_2.wav +3 -0
- compare_audio/fish_speech_1.wav +3 -0
- compare_audio/fish_speech_2.wav +3 -0
- compare_audio/gpt-soVITs_1.wav +3 -0
- compare_audio/gpt-soVITs_2.wav +3 -0
- compare_audio/index_tts_1.wav +3 -0
- compare_audio/index_tts_2.wav +3 -0
- compare_audio/openvoice_1.wav +3 -0
- compare_audio/openvoice_2.wav +3 -0
- compare_audio/orpheus_1.wav +3 -0
- compare_audio/orpheus_2.wav +3 -0
- compare_audio/spark_tts_1.wav +3 -0
- compare_audio/spark_tts_2.wav +3 -0
- compare_audio/styletts2_1.wav +3 -0
- compare_audio/styletts2_2.wav +3 -0
- compare_audio/vibe_voice_1.wav +3 -0
- compare_audio/vibe_voice_2.wav +3 -0
- feedback.csv +2 -0
- score.py +46 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
*.wav filter=lfs diff=lfs merge=lfs -text
|
.idea/.gitignore
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Default ignored files
|
| 2 |
+
/shelf/
|
| 3 |
+
/workspace.xml
|
| 4 |
+
# Editor-based HTTP Client requests
|
| 5 |
+
/httpRequests/
|
| 6 |
+
# Datasource local storage ignored files
|
| 7 |
+
/dataSources/
|
| 8 |
+
/dataSources.local.xml
|
.idea/inspectionProfiles/Project_Default.xml
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<component name="InspectionProjectProfileManager">
|
| 2 |
+
<profile version="1.0">
|
| 3 |
+
<option name="myName" value="Project Default" />
|
| 4 |
+
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
| 5 |
+
<option name="ignoredPackages">
|
| 6 |
+
<value>
|
| 7 |
+
<list size="105">
|
| 8 |
+
<item index="0" class="java.lang.String" itemvalue="monotonic-align" />
|
| 9 |
+
<item index="1" class="java.lang.String" itemvalue="typing" />
|
| 10 |
+
<item index="2" class="java.lang.String" itemvalue="g2pk" />
|
| 11 |
+
<item index="3" class="java.lang.String" itemvalue="typing-extensions" />
|
| 12 |
+
<item index="4" class="java.lang.String" itemvalue="absl-py" />
|
| 13 |
+
<item index="5" class="java.lang.String" itemvalue="numba" />
|
| 14 |
+
<item index="6" class="java.lang.String" itemvalue="protobuf" />
|
| 15 |
+
<item index="7" class="java.lang.String" itemvalue="torchmetrics" />
|
| 16 |
+
<item index="8" class="java.lang.String" itemvalue="threadpoolctl" />
|
| 17 |
+
<item index="9" class="java.lang.String" itemvalue="docstring_parser" />
|
| 18 |
+
<item index="10" class="java.lang.String" itemvalue="huggingface-hub" />
|
| 19 |
+
<item index="11" class="java.lang.String" itemvalue="scikit-learn" />
|
| 20 |
+
<item index="12" class="java.lang.String" itemvalue="nvidia-cuda-cupti-cu12" />
|
| 21 |
+
<item index="13" class="java.lang.String" itemvalue="nvidia-cufft-cu12" />
|
| 22 |
+
<item index="14" class="java.lang.String" itemvalue="executing" />
|
| 23 |
+
<item index="15" class="java.lang.String" itemvalue="fsspec" />
|
| 24 |
+
<item index="16" class="java.lang.String" itemvalue="nvidia-cusolver-cu12" />
|
| 25 |
+
<item index="17" class="java.lang.String" itemvalue="torch-audiomentations" />
|
| 26 |
+
<item index="18" class="java.lang.String" itemvalue="nvidia-curand-cu12" />
|
| 27 |
+
<item index="19" class="java.lang.String" itemvalue="filelock" />
|
| 28 |
+
<item index="20" class="java.lang.String" itemvalue="Pygments" />
|
| 29 |
+
<item index="21" class="java.lang.String" itemvalue="safetensors" />
|
| 30 |
+
<item index="22" class="java.lang.String" itemvalue="certifi" />
|
| 31 |
+
<item index="23" class="java.lang.String" itemvalue="semver" />
|
| 32 |
+
<item index="24" class="java.lang.String" itemvalue="accelerate" />
|
| 33 |
+
<item index="25" class="java.lang.String" itemvalue="lxml" />
|
| 34 |
+
<item index="26" class="java.lang.String" itemvalue="nvidia-cuda-runtime-cu12" />
|
| 35 |
+
<item index="27" class="java.lang.String" itemvalue="speechbrain" />
|
| 36 |
+
<item index="28" class="java.lang.String" itemvalue="pyparsing" />
|
| 37 |
+
<item index="29" class="java.lang.String" itemvalue="torchaudio" />
|
| 38 |
+
<item index="30" class="java.lang.String" itemvalue="optuna" />
|
| 39 |
+
<item index="31" class="java.lang.String" itemvalue="tokenizers" />
|
| 40 |
+
<item index="32" class="java.lang.String" itemvalue="nvidia-cuda-nvrtc-cu12" />
|
| 41 |
+
<item index="33" class="java.lang.String" itemvalue="transformers" />
|
| 42 |
+
<item index="34" class="java.lang.String" itemvalue="triton" />
|
| 43 |
+
<item index="35" class="java.lang.String" itemvalue="rdflib" />
|
| 44 |
+
<item index="36" class="java.lang.String" itemvalue="aiohappyeyeballs" />
|
| 45 |
+
<item index="37" class="java.lang.String" itemvalue="kiwisolver" />
|
| 46 |
+
<item index="38" class="java.lang.String" itemvalue="pytorch-metric-learning" />
|
| 47 |
+
<item index="39" class="java.lang.String" itemvalue="pexpect" />
|
| 48 |
+
<item index="40" class="java.lang.String" itemvalue="click" />
|
| 49 |
+
<item index="41" class="java.lang.String" itemvalue="attrs" />
|
| 50 |
+
<item index="42" class="java.lang.String" itemvalue="psutil" />
|
| 51 |
+
<item index="43" class="java.lang.String" itemvalue="bibtexparser" />
|
| 52 |
+
<item index="44" class="java.lang.String" itemvalue="fonttools" />
|
| 53 |
+
<item index="45" class="java.lang.String" itemvalue="pytorch-lightning" />
|
| 54 |
+
<item index="46" class="java.lang.String" itemvalue="nvidia-cublas-cu12" />
|
| 55 |
+
<item index="47" class="java.lang.String" itemvalue="tensorboard" />
|
| 56 |
+
<item index="48" class="java.lang.String" itemvalue="asttokens" />
|
| 57 |
+
<item index="49" class="java.lang.String" itemvalue="nvidia-nvtx-cu12" />
|
| 58 |
+
<item index="50" class="java.lang.String" itemvalue="propcache" />
|
| 59 |
+
<item index="51" class="java.lang.String" itemvalue="matplotlib" />
|
| 60 |
+
<item index="52" class="java.lang.String" itemvalue="charset-normalizer" />
|
| 61 |
+
<item index="53" class="java.lang.String" itemvalue="librosa" />
|
| 62 |
+
<item index="54" class="java.lang.String" itemvalue="ffmpy" />
|
| 63 |
+
<item index="55" class="java.lang.String" itemvalue="Mako" />
|
| 64 |
+
<item index="56" class="java.lang.String" itemvalue="referencing" />
|
| 65 |
+
<item index="57" class="java.lang.String" itemvalue="decorator" />
|
| 66 |
+
<item index="58" class="java.lang.String" itemvalue="a-unet" />
|
| 67 |
+
<item index="59" class="java.lang.String" itemvalue="alembic" />
|
| 68 |
+
<item index="60" class="java.lang.String" itemvalue="networkx" />
|
| 69 |
+
<item index="61" class="java.lang.String" itemvalue="nvidia-nvjitlink-cu12" />
|
| 70 |
+
<item index="62" class="java.lang.String" itemvalue="ptyprocess" />
|
| 71 |
+
<item index="63" class="java.lang.String" itemvalue="SQLAlchemy" />
|
| 72 |
+
<item index="64" class="java.lang.String" itemvalue="nvidia-cusparse-cu12" />
|
| 73 |
+
<item index="65" class="java.lang.String" itemvalue="llvmlite" />
|
| 74 |
+
<item index="66" class="java.lang.String" itemvalue="numpy" />
|
| 75 |
+
<item index="67" class="java.lang.String" itemvalue="Jinja2" />
|
| 76 |
+
<item index="68" class="java.lang.String" itemvalue="nvidia-nccl-cu12" />
|
| 77 |
+
<item index="69" class="java.lang.String" itemvalue="segments" />
|
| 78 |
+
<item index="70" class="java.lang.String" itemvalue="clldutils" />
|
| 79 |
+
<item index="71" class="java.lang.String" itemvalue="rpds-py" />
|
| 80 |
+
<item index="72" class="java.lang.String" itemvalue="lightning-utilities" />
|
| 81 |
+
<item index="73" class="java.lang.String" itemvalue="pyannote.database" />
|
| 82 |
+
<item index="74" class="java.lang.String" itemvalue="urllib3" />
|
| 83 |
+
<item index="75" class="java.lang.String" itemvalue="scipy" />
|
| 84 |
+
<item index="76" class="java.lang.String" itemvalue="six" />
|
| 85 |
+
<item index="77" class="java.lang.String" itemvalue="typer" />
|
| 86 |
+
<item index="78" class="java.lang.String" itemvalue="importlib_resources" />
|
| 87 |
+
<item index="79" class="java.lang.String" itemvalue="markdown2" />
|
| 88 |
+
<item index="80" class="java.lang.String" itemvalue="prompt_toolkit" />
|
| 89 |
+
<item index="81" class="java.lang.String" itemvalue="ruamel.yaml" />
|
| 90 |
+
<item index="82" class="java.lang.String" itemvalue="tzdata" />
|
| 91 |
+
<item index="83" class="java.lang.String" itemvalue="ipython" />
|
| 92 |
+
<item index="84" class="java.lang.String" itemvalue="rich" />
|
| 93 |
+
<item index="85" class="java.lang.String" itemvalue="nvidia-cudnn-cu12" />
|
| 94 |
+
<item index="86" class="java.lang.String" itemvalue="torch" />
|
| 95 |
+
<item index="87" class="java.lang.String" itemvalue="dlinfo" />
|
| 96 |
+
<item index="88" class="java.lang.String" itemvalue="termcolor" />
|
| 97 |
+
<item index="89" class="java.lang.String" itemvalue="data-science-types" />
|
| 98 |
+
<item index="90" class="java.lang.String" itemvalue="soundfile" />
|
| 99 |
+
<item index="91" class="java.lang.String" itemvalue="babel" />
|
| 100 |
+
<item index="92" class="java.lang.String" itemvalue="aiohttp" />
|
| 101 |
+
<item index="93" class="java.lang.String" itemvalue="grpcio" />
|
| 102 |
+
<item index="94" class="java.lang.String" itemvalue="yarl" />
|
| 103 |
+
<item index="95" class="java.lang.String" itemvalue="pytz" />
|
| 104 |
+
<item index="96" class="java.lang.String" itemvalue="einops" />
|
| 105 |
+
<item index="97" class="java.lang.String" itemvalue="aiosignal" />
|
| 106 |
+
<item index="98" class="java.lang.String" itemvalue="pylatexenc" />
|
| 107 |
+
<item index="99" class="java.lang.String" itemvalue="argbind" />
|
| 108 |
+
<item index="100" class="java.lang.String" itemvalue="fire" />
|
| 109 |
+
<item index="101" class="java.lang.String" itemvalue="randomname" />
|
| 110 |
+
<item index="102" class="java.lang.String" itemvalue="torch-stoi" />
|
| 111 |
+
<item index="103" class="java.lang.String" itemvalue="pystoi" />
|
| 112 |
+
<item index="104" class="java.lang.String" itemvalue="flatten-dict" />
|
| 113 |
+
</list>
|
| 114 |
+
</value>
|
| 115 |
+
</option>
|
| 116 |
+
</inspection_tool>
|
| 117 |
+
</profile>
|
| 118 |
+
</component>
|
.idea/inspectionProfiles/profiles_settings.xml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<component name="InspectionProjectProfileManager">
|
| 2 |
+
<settings>
|
| 3 |
+
<option name="USE_PROJECT_PROFILE" value="false" />
|
| 4 |
+
<version value="1.0" />
|
| 5 |
+
</settings>
|
| 6 |
+
</component>
|
.idea/misc.xml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="Black">
|
| 4 |
+
<option name="sdkName" value="Python 3.11 (TTSBenchmarkTrivita)" />
|
| 5 |
+
</component>
|
| 6 |
+
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (TTSBenchmarkTrivita)" project-jdk-type="Python SDK" />
|
| 7 |
+
</project>
|
.idea/vcs.xml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="VcsDirectoryMappings">
|
| 4 |
+
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
| 5 |
+
</component>
|
| 6 |
+
</project>
|
app.py
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import os
|
| 4 |
+
import random
|
| 5 |
+
|
| 6 |
+
FEEDBACK_FILE = "arena_feedback.csv"
|
| 7 |
+
|
| 8 |
+
# Nếu chưa có file thì tạo
|
| 9 |
+
if not os.path.exists(FEEDBACK_FILE):
|
| 10 |
+
df = pd.DataFrame(columns=["text_id", "model_A", "model_B", "choice"])
|
| 11 |
+
df.to_csv(FEEDBACK_FILE, index=False)
|
| 12 |
+
|
| 13 |
+
# Danh sách mẫu: 2 câu × 5 model
|
| 14 |
+
samples = {
|
| 15 |
+
1: {
|
| 16 |
+
"text": "Although the weather forecast predicted heavy rain throughout the entire week, we decided to continue our outdoor project, bringing along waterproof equipment, extra clothes, and sufficient food supplies to stay safe.",
|
| 17 |
+
"audios": {
|
| 18 |
+
"F5 TTS": "compare_audio/f5_tts_1.wav",
|
| 19 |
+
"Fish Speech": "compare_audio/fish_speech_1.wav",
|
| 20 |
+
"GPT SoVITS": "compare_audio/gpt-soVITs_1.wav",
|
| 21 |
+
"Index TTS": "compare_audio/index_tts_1.wav",
|
| 22 |
+
"Open Voice": "compare_audio/openvoice_1.wav",
|
| 23 |
+
"Orpheus": "compare_audio/orpheus_1.wav",
|
| 24 |
+
"Spark TTS": "compare_audio/spark_tts_1.wav",
|
| 25 |
+
"StyleTTS2": "compare_audio/styletts2_1.wav",
|
| 26 |
+
"Vibe Voice": "compare_audio/vibe_voice_1.wav",
|
| 27 |
+
},
|
| 28 |
+
},
|
| 29 |
+
2: {
|
| 30 |
+
"text": "Because the team members collaborated effectively, shared their knowledge openly, and supported each other during stressful moments, the complicated project was completed successfully ahead of schedule and impressed the clients greatly.",
|
| 31 |
+
"audios": {
|
| 32 |
+
"F5 TTS": "compare_audio/f5_tts_2.wav",
|
| 33 |
+
"Fish Speech": "compare_audio/fish_speech_2.wav",
|
| 34 |
+
"GPT SoVITS": "compare_audio/gpt-soVITs_2.wav",
|
| 35 |
+
"Index TTS": "compare_audio/index_tts_2.wav",
|
| 36 |
+
"Open Voice": "compare_audio/openvoice_2.wav",
|
| 37 |
+
"Orpheus": "compare_audio/orpheus_2.wav",
|
| 38 |
+
"Spark TTS": "compare_audio/spark_tts_2.wav",
|
| 39 |
+
"StyleTTS2": "compare_audio/styletts2_2.wav",
|
| 40 |
+
"Vibe Voice": "compare_audio/vibe_voice_2.wav",
|
| 41 |
+
},
|
| 42 |
+
},
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
def random_pair():
|
| 47 |
+
# Random chọn câu
|
| 48 |
+
text_id = random.choice(list(samples.keys()))
|
| 49 |
+
text = samples[text_id]["text"]
|
| 50 |
+
|
| 51 |
+
# Random chọn 2 model khác nhau
|
| 52 |
+
model_names = list(samples[text_id]["audios"].keys())
|
| 53 |
+
model_A, model_B = random.sample(model_names, 2)
|
| 54 |
+
|
| 55 |
+
audio_A = samples[text_id]["audios"][model_A]
|
| 56 |
+
audio_B = samples[text_id]["audios"][model_B]
|
| 57 |
+
|
| 58 |
+
return text, audio_A, audio_B, text_id, model_A, model_B
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
def save_choice(text_id, model_A, model_B, choice):
|
| 62 |
+
df = pd.read_csv(FEEDBACK_FILE)
|
| 63 |
+
df = pd.concat(
|
| 64 |
+
[df, pd.DataFrame([{
|
| 65 |
+
"text_id": text_id,
|
| 66 |
+
"model_A": model_A,
|
| 67 |
+
"model_B": model_B,
|
| 68 |
+
"choice": choice
|
| 69 |
+
}])],
|
| 70 |
+
ignore_index=True,
|
| 71 |
+
)
|
| 72 |
+
df.to_csv(FEEDBACK_FILE, index=False)
|
| 73 |
+
|
| 74 |
+
# Load random cặp mới
|
| 75 |
+
text, audio_A, audio_B, new_text_id, new_model_A, new_model_B = random_pair()
|
| 76 |
+
return (
|
| 77 |
+
f"✅ Đã lưu lựa chọn: {choice} (Câu {text_id}, {model_A} vs {model_B})",
|
| 78 |
+
text,
|
| 79 |
+
audio_A,
|
| 80 |
+
audio_B,
|
| 81 |
+
new_text_id,
|
| 82 |
+
new_model_A,
|
| 83 |
+
new_model_B,
|
| 84 |
+
)
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
with gr.Blocks() as demo:
|
| 88 |
+
gr.Markdown("## 🎧 Arena TTS Evaluation. Nghe 2 mẫu, chọn cái bạn thấy hay hơn.")
|
| 89 |
+
|
| 90 |
+
text_display = gr.Textbox(label="Câu gốc", interactive=False)
|
| 91 |
+
audio_A = gr.Audio(label="Mẫu A", type="filepath")
|
| 92 |
+
audio_B = gr.Audio(label="Mẫu B", type="filepath")
|
| 93 |
+
|
| 94 |
+
hidden_text_id = gr.Number(visible=False)
|
| 95 |
+
hidden_model_A = gr.Textbox(visible=False)
|
| 96 |
+
hidden_model_B = gr.Textbox(visible=False)
|
| 97 |
+
|
| 98 |
+
with gr.Row():
|
| 99 |
+
btn_A = gr.Button("Chọn A")
|
| 100 |
+
btn_B = gr.Button("Chọn B")
|
| 101 |
+
|
| 102 |
+
output_msg = gr.Label()
|
| 103 |
+
|
| 104 |
+
btn_A.click(
|
| 105 |
+
fn=lambda tid, ma, mb: save_choice(tid, ma, mb, "A"),
|
| 106 |
+
inputs=[hidden_text_id, hidden_model_A, hidden_model_B],
|
| 107 |
+
outputs=[output_msg, text_display, audio_A, audio_B, hidden_text_id, hidden_model_A, hidden_model_B],
|
| 108 |
+
)
|
| 109 |
+
btn_B.click(
|
| 110 |
+
fn=lambda tid, ma, mb: save_choice(tid, ma, mb, "B"),
|
| 111 |
+
inputs=[hidden_text_id, hidden_model_A, hidden_model_B],
|
| 112 |
+
outputs=[output_msg, text_display, audio_A, audio_B, hidden_text_id, hidden_model_A, hidden_model_B],
|
| 113 |
+
)
|
| 114 |
+
|
| 115 |
+
# Load random pair khi khởi động
|
| 116 |
+
demo.load(random_pair, None, [text_display, audio_A, audio_B, hidden_text_id, hidden_model_A, hidden_model_B])
|
| 117 |
+
|
| 118 |
+
if __name__ == "__main__":
|
| 119 |
+
demo.launch()
|
arena_feedback.csv
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
text_id,choice,model_A,model_B
|
| 2 |
+
2.0,A,Fish Speech,GPT SoVITS
|
| 3 |
+
1.0,B,Spark TTS,Vibe Voice
|
| 4 |
+
1.0,B,Vibe Voice,F5 TTS
|
| 5 |
+
2.0,B,GPT SoVITS,Spark TTS
|
| 6 |
+
2.0,A,StyleTTS2,Spark TTS
|
| 7 |
+
1.0,A,Fish Speech,Index TTS
|
| 8 |
+
2.0,B,F5 TTS,Vibe Voice
|
compare_audio/1_male.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4baed8faa47f3c111bafc5ad89d284f2ecf8053065c4c769f57eddae32eed2b5
|
| 3 |
+
size 421966
|
compare_audio/2_female.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:34776ece150b5950f6d71dcd49972ac60bb3fad4a513a52b308d67e56c02d94f
|
| 3 |
+
size 417870
|
compare_audio/f5_tts_1.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:500001dd24555ed3cfedf5ac23a254286b8e14f9f589bc6a1c81c3742b91c8ed
|
| 3 |
+
size 628268
|
compare_audio/f5_tts_2.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5dbfdaa44ea0e7bda0d81c51104959b916d029575145d6496d7d6a85cb6e3aef
|
| 3 |
+
size 590892
|
compare_audio/fish_speech_1.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2bc3b80fdbbbc86cc294d21370134c684e8c3c09c1cb095f636a6a28d5ba9864
|
| 3 |
+
size 1003564
|
compare_audio/fish_speech_2.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:bfbcf419fcd7eb87adb2c1260aaee6a45d6cbf79b91d29caf0ddb2e736b76e95
|
| 3 |
+
size 991276
|
compare_audio/gpt-soVITs_1.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c3ec5145f3cfbaad6c87be28c1fd61e7395e35288bf9eb211cbe2315a93784cc
|
| 3 |
+
size 848684
|
compare_audio/gpt-soVITs_2.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0b10bb6f2d1649375c691107be7746db40cccac636c53f8deeb13b0ad09e7bb0
|
| 3 |
+
size 812844
|
compare_audio/index_tts_1.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c9acd4b278923af455dd4512615d618dada99b2d4116ac0078bbec3085bf9629
|
| 3 |
+
size 567886
|
compare_audio/index_tts_2.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:56a2ef45a68327d150a936b390a389e13f94e871c11248a24e8175640ff1c2e7
|
| 3 |
+
size 507982
|
compare_audio/openvoice_1.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0002fc6ee8bc53b6b565a4a1e72badb3f5ffa0c81f7e283ff9756d8585b5789e
|
| 3 |
+
size 505900
|
compare_audio/openvoice_2.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5ceca072da6274c4e8567bd686070e2d4fb8b9a42f75d07d51fbda397618eba1
|
| 3 |
+
size 544300
|
compare_audio/orpheus_1.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4ae638d1fa04e90a871c48c382e734c043f53938e1b4eb37a75ec727b4f3d5fc
|
| 3 |
+
size 573484
|
compare_audio/orpheus_2.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9b1a0dfd5dab26d7503634b696a8caea785977f2a865bdc43fcef1d8b529352f
|
| 3 |
+
size 655404
|
compare_audio/spark_tts_1.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:358610009945e57b75483d3162d0975474fe6bee2179d3f6ee9cc58f7fb90f66
|
| 3 |
+
size 448684
|
compare_audio/spark_tts_2.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:98bd16ba58fef47b7ef79605a33bfd24cd60bc13ce19cc1c260edb90c33d3732
|
| 3 |
+
size 378924
|
compare_audio/styletts2_1.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ce46e7f97b8ae36e0582a4e887e0bdfd7aecf445b8b3c2b00ba3d9d824919a6f
|
| 3 |
+
size 707844
|
compare_audio/styletts2_2.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:3f3fbab6748edfeb6814f1d1e96b79ef176bb9086c46f9164d0d93258df37ec3
|
| 3 |
+
size 668244
|
compare_audio/vibe_voice_1.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f923da09f2d7fb346596259c50b96fa25449a104c15a9db6a58864ba6476d0d5
|
| 3 |
+
size 531244
|
compare_audio/vibe_voice_2.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:818aa85416582fe8a10daef7f8a59ecde80efd3f06a0c74662a2288ad67978eb
|
| 3 |
+
size 659244
|
feedback.csv
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
audio_file,rating,comment
|
| 2 |
+
Mẫu 1,1,hơi tệ
|
score.py
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
|
| 3 |
+
import pandas as pd
|
| 4 |
+
FEEDBACK_FILE = "arena_feedback.csv"
|
| 5 |
+
|
| 6 |
+
def compute_arena_scores(feedback_file=FEEDBACK_FILE):
|
| 7 |
+
if not os.path.exists(feedback_file):
|
| 8 |
+
return "⚠️ Chưa có dữ liệu đánh giá!"
|
| 9 |
+
|
| 10 |
+
df = pd.read_csv(feedback_file)
|
| 11 |
+
if df.empty:
|
| 12 |
+
return "⚠️ File rỗng, chưa có lượt vote nào!"
|
| 13 |
+
|
| 14 |
+
results = {}
|
| 15 |
+
|
| 16 |
+
for _, row in df.iterrows():
|
| 17 |
+
mA, mB, choice = row["model_A"], row["model_B"], row["choice"]
|
| 18 |
+
|
| 19 |
+
# Khởi tạo nếu chưa có
|
| 20 |
+
for m in [mA, mB]:
|
| 21 |
+
if m not in results:
|
| 22 |
+
results[m] = {"win": 0, "loss": 0}
|
| 23 |
+
|
| 24 |
+
if choice == "A":
|
| 25 |
+
results[mA]["win"] += 1
|
| 26 |
+
results[mB]["loss"] += 1
|
| 27 |
+
elif choice == "B":
|
| 28 |
+
results[mB]["win"] += 1
|
| 29 |
+
results[mA]["loss"] += 1
|
| 30 |
+
|
| 31 |
+
# Tính Arena Score
|
| 32 |
+
scores = {}
|
| 33 |
+
for model, wl in results.items():
|
| 34 |
+
total = wl["win"] + wl["loss"]
|
| 35 |
+
score = wl["win"] / total if total > 0 else 0
|
| 36 |
+
scores[model] = {
|
| 37 |
+
"wins": wl["win"],
|
| 38 |
+
"losses": wl["loss"],
|
| 39 |
+
"arena_score": round(score, 3),
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
return pd.DataFrame(scores).T.sort_values("arena_score", ascending=False)
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
scores_df = compute_arena_scores()
|
| 46 |
+
print(scores_df)
|