Upload 3 files
Browse files- index.html +48 -18
- script.js +71 -0
- styles.css +66 -0
index.html
CHANGED
|
@@ -1,19 +1,49 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</html>
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>角色信息表</title>
|
| 7 |
+
<link rel="stylesheet" href="styles.css">
|
| 8 |
+
</head>
|
| 9 |
+
<body>
|
| 10 |
+
<h1>角色信息表</h1>
|
| 11 |
+
<div id="filters">
|
| 12 |
+
<label for="gender">性别:</label>
|
| 13 |
+
<select id="gender">
|
| 14 |
+
<option value="">不限</option>
|
| 15 |
+
<option value="Male">男</option>
|
| 16 |
+
<option value="Female">女</option>
|
| 17 |
+
</select>
|
| 18 |
+
<label for="locale">语言:</label>
|
| 19 |
+
<select id="locale">
|
| 20 |
+
<option value="">不限</option>
|
| 21 |
+
<option value="zh-CN">中文</option>
|
| 22 |
+
<!-- 其他语言选项 -->
|
| 23 |
+
</select>
|
| 24 |
+
<!-- 其他筛选选项 -->
|
| 25 |
+
</div>
|
| 26 |
+
<table id="voicesTable">
|
| 27 |
+
<thead>
|
| 28 |
+
<tr>
|
| 29 |
+
<th>显示名称</th>
|
| 30 |
+
<th>性别</th>
|
| 31 |
+
<th>本地名称</th>
|
| 32 |
+
<th>语言</th>
|
| 33 |
+
<th>状态</th>
|
| 34 |
+
<th>采样率</th>
|
| 35 |
+
<th>风格列表</th>
|
| 36 |
+
<th>角色扮演列表</th>
|
| 37 |
+
<th>语音类型</th>
|
| 38 |
+
<th>每分钟单词数</th>
|
| 39 |
+
<th>试听音频</th>
|
| 40 |
+
<!-- 其他表头 -->
|
| 41 |
+
</tr>
|
| 42 |
+
</thead>
|
| 43 |
+
<tbody>
|
| 44 |
+
<!-- 角色信息将在这里动态插入 -->
|
| 45 |
+
</tbody>
|
| 46 |
+
</table>
|
| 47 |
+
<script src="script.js"></script>
|
| 48 |
+
</body>
|
| 49 |
</html>
|
script.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 2 |
+
fetch('https://99i-tts.hf.space/voices?l=zh&d')
|
| 3 |
+
.then(response => response.json())
|
| 4 |
+
.then(data => {
|
| 5 |
+
const voices = data.voices;
|
| 6 |
+
displayVoices(voices);
|
| 7 |
+
setupFilters(voices);
|
| 8 |
+
});
|
| 9 |
+
|
| 10 |
+
function displayVoices(voices) {
|
| 11 |
+
const tableBody = document.getElementById('voicesTable').getElementsByTagName('tbody')[0];
|
| 12 |
+
tableBody.innerHTML = ''; // 清空表格
|
| 13 |
+
|
| 14 |
+
voices.forEach(voice => {
|
| 15 |
+
const row = tableBody.insertRow();
|
| 16 |
+
row.insertCell(0).innerText = voice.ShortName;
|
| 17 |
+
row.insertCell(1).innerText = voice.Gender;
|
| 18 |
+
row.insertCell(2).innerText = voice.LocalName;
|
| 19 |
+
row.insertCell(3).innerText = voice.LocaleName;
|
| 20 |
+
row.insertCell(4).innerText = voice.Status;
|
| 21 |
+
row.insertCell(5).innerText = voice.SampleRateHertz;
|
| 22 |
+
row.insertCell(6).innerText = voice.StyleList ? voice.StyleList.join(', ') : '';
|
| 23 |
+
row.insertCell(7).innerText = voice.RolePlayList ? voice.RolePlayList.join(', ') : '';
|
| 24 |
+
row.insertCell(8).innerText = voice.VoiceType;
|
| 25 |
+
row.insertCell(9).innerText = voice.WordsPerMinute;
|
| 26 |
+
// 插入其他单元格
|
| 27 |
+
// 添加试听音频列
|
| 28 |
+
const audioCell = row.insertCell(10);
|
| 29 |
+
if (voice.StyleList && voice.StyleList.length > 0) {
|
| 30 |
+
voice.StyleList.forEach(style => {
|
| 31 |
+
const styleName = document.createElement('span');
|
| 32 |
+
styleName.innerText = `${style}: `;
|
| 33 |
+
audioCell.appendChild(styleName);
|
| 34 |
+
|
| 35 |
+
const audioUrl = `https://99i-tts.hf.space/tts?v=${voice.ShortName}&t=很高兴见到你&s=${style}`;
|
| 36 |
+
const audio = document.createElement('audio');
|
| 37 |
+
audio.src = audioUrl;
|
| 38 |
+
audio.controls = true;
|
| 39 |
+
audioCell.appendChild(audio);
|
| 40 |
+
});
|
| 41 |
+
} else {
|
| 42 |
+
// 如果没有风格,提供一个默认的试听音频
|
| 43 |
+
const audioUrl = `https://99i-tts.hf.space/tts?v=${voice.ShortName}&t=很高兴见到你`;
|
| 44 |
+
const audio = document.createElement('audio');
|
| 45 |
+
audio.src = audioUrl;
|
| 46 |
+
audio.controls = true;
|
| 47 |
+
audioCell.appendChild(audio);
|
| 48 |
+
}
|
| 49 |
+
});
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
function setupFilters(voices) {
|
| 53 |
+
const genderSelect = document.getElementById('gender');
|
| 54 |
+
const localeSelect = document.getElementById('locale');
|
| 55 |
+
|
| 56 |
+
genderSelect.addEventListener('change', () => filterVoices());
|
| 57 |
+
localeSelect.addEventListener('change', () => filterVoices());
|
| 58 |
+
|
| 59 |
+
function filterVoices() {
|
| 60 |
+
const selectedGender = genderSelect.value;
|
| 61 |
+
const selectedLocale = localeSelect.value;
|
| 62 |
+
|
| 63 |
+
const filteredVoices = voices.filter(voice => {
|
| 64 |
+
return (selectedGender === '' || voice.Gender === selectedGender) &&
|
| 65 |
+
(selectedLocale === '' || voice.Locale === selectedLocale);
|
| 66 |
+
});
|
| 67 |
+
|
| 68 |
+
displayVoices(filteredVoices);
|
| 69 |
+
}
|
| 70 |
+
}
|
| 71 |
+
});
|
styles.css
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 2 |
+
fetch('https://99i-tts.hf.space/voices?l=zh&d')
|
| 3 |
+
.then(response => response.json())
|
| 4 |
+
.then(data => {
|
| 5 |
+
const voices = data.voices;
|
| 6 |
+
displayVoices(voices);
|
| 7 |
+
setupFilters(voices);
|
| 8 |
+
});
|
| 9 |
+
|
| 10 |
+
function displayVoices(voices) {
|
| 11 |
+
const tableBody = document.getElementById('voicesTable').getElementsByTagName('tbody')[0];
|
| 12 |
+
tableBody.innerHTML = ''; // 清空表格
|
| 13 |
+
|
| 14 |
+
voices.forEach(voice => {
|
| 15 |
+
const row = tableBody.insertRow();
|
| 16 |
+
row.insertCell(0).innerText = voice.DisplayName;
|
| 17 |
+
row.insertCell(1).innerText = voice.Gender;
|
| 18 |
+
row.insertCell(2).innerText = voice.LocalName;
|
| 19 |
+
row.insertCell(3).innerText = voice.LocaleName;
|
| 20 |
+
row.insertCell(4).innerText = voice.Status;
|
| 21 |
+
// 插入其他单元格
|
| 22 |
+
});
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
function setupFilters(voices) {
|
| 26 |
+
const genderSelect = document.getElementById('gender');
|
| 27 |
+
const localeSelect = document.getElementById('locale');
|
| 28 |
+
|
| 29 |
+
genderSelect.addEventListener('change', () => filterVoices());
|
| 30 |
+
localeSelect.addEventListener('change', () => filterVoices());
|
| 31 |
+
|
| 32 |
+
function filterVoices() {
|
| 33 |
+
const selectedGender = genderSelect.value;
|
| 34 |
+
const selectedLocale = localeSelect.value;
|
| 35 |
+
|
| 36 |
+
const filteredVoices = voices.filter(voice => {
|
| 37 |
+
return (selectedGender === '' || voice.Gender === selectedGender) &&
|
| 38 |
+
(selectedLocale === '' || voice.Locale === selectedLocale);
|
| 39 |
+
});
|
| 40 |
+
|
| 41 |
+
displayVoices(filteredVoices);
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
});
|
| 45 |
+
body {
|
| 46 |
+
font-family: Arial, sans-serif;
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
#filters {
|
| 50 |
+
margin-bottom: 20px;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
table {
|
| 54 |
+
width: 100%;
|
| 55 |
+
border-collapse: collapse;
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
th, td {
|
| 59 |
+
border: 1px solid #ddd;
|
| 60 |
+
padding: 8px;
|
| 61 |
+
text-align: left;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
th {
|
| 65 |
+
background-color: #f2f2f2;
|
| 66 |
+
}
|