Skip to content

feat: [WebUI] support multi speaker configurations;support inline pause tags , improved pause duration control and Add functionality for saving and downloading separated speaker audio files with zip packaging - #22

Open
selfuppen wants to merge 32 commits into
Soul-AILab:mainfrom
selfuppen:main

Conversation

@selfuppen

@selfuppen selfuppen commented Nov 4, 2025

Copy link
Copy Markdown
  • Add feature: support multi speaker configurations , allowing 10 speakers at most.
    • Enhanced language switching capabilities for UI components.
  • feat: enhance dialog synthesis; support inline pause tags and improved pause duration control
    e.g.
    [S1] The weather is nice today <|pause:300|> let's go for a walk <|pause:800|> shall we?
    [S2] Sure <|pause:200|> let's go
  • feat: add configurable pauses between speakers; support multi-line dialog text
PixPin_2025-11-05_23-40-28

- Expanded the dialogue synthesis function to support dynamic speaker configurations
- Enhanced language switching capabilities for UI components.
- Introduced new labels for speaker management buttons, including "Add Speaker", "Quick Add", "Select All", and "Delete Selected".
- Implemented a function to dynamically generate speaker selection labels based on the current language.
- Updated the UI to utilize internationalization for speaker-related components, enhancing user experience across different languages.
@selfuppen selfuppen closed this Nov 5, 2025
@selfuppen selfuppen reopened this Nov 5, 2025
@selfuppen selfuppen changed the title feat: Expanded the dialogue synthesis function to support dynamic speaker number configurations feat: support multi speaker configurations;support inline pause tags and improved pause duration control Nov 5, 2025
@selfuppen selfuppen mentioned this pull request Nov 5, 2025
@selfuppen selfuppen changed the title feat: support multi speaker configurations;support inline pause tags and improved pause duration control feat: [WebUI] support multi speaker configurations;support inline pause tags , improved pause duration control and Add functionality for saving and downloading separated speaker audio files with zip packaging Nov 10, 2025
@zhangyiwen123

Copy link
Copy Markdown

请问下,支持内联暂停标签,改进了暂停时长控制的功能具体是修改了哪部分?试了<|pause:800|>无效么

yegq added 13 commits December 12, 2025 19:35
在多个输入框中填写不同的对话文本
点击一次生成按钮,系统会自动按顺序处理所有任务
查看每个任务的详细处理信息和结果
文件组织结构
outputs/separated_speakers/└── 20251212_192323/          # 统一的时间戳文件夹(同一次提交的所有任务)    ├── 001/                  # 第一个文本框生成的文件    │   ├── complete_dialogue.wav    │   ├── 001_speaker1_part1.wav    │   ├── 002_speaker2_part1.wav    │   └── XXX_all_audio_files.zip    ├── 002/                  # 第二个文本框生成的文件    │   ├── complete_dialogue.wav    │   └── ...    └── 003/                  # 第三个文本框生成的文件        ├── complete_dialogue.wav        └── ...
主要改动
统一时间戳:在队列处理开始时生成一个时间戳,所有任务共用同一个时间戳文件夹
编号子文件夹:每个任务的文件保存在以任务编号命名的子文件夹中(001/, 002/, 003/等)
路径显示:信息展示中包含:
基础文件夹路径(时间戳文件夹)
任务子文件夹名称
完整路径
1. 为每个合成文本任务添加预览和下载
为每个文本输入框添加了对应的音频预览组件和下载组件
任务完成后,每个任务的音频预览和下载链接会显示在对应文本输入框下方
支持多语言标签(中文/英文)
2. 合并所有任务的音频到总文件
在所有任务完成后,自动将所有任务的 complete_dialogue.wav 文件合并成一个 all.wav 文件
合并文件保存在时间戳根目录(如 ./20251213_042314/all.wav)
不同任务之间自动添加 500ms 的停顿间隔
支持单声道和立体声音频的合并
主要修改点:
在文本输入框下方添加了音频预览和下载组件
修改了 collect_and_synthesize_queue 函数,保存每个任务的结果并返回
添加了音频合并逻辑,将所有任务的完整对话音频合并到 all.wav
更新了可见性控制逻辑,确保组件正确显示/隐藏
更新了语言切换功能,支持新组件的多语言标签
代码已通过语法检查,可以正常使用。每个任务现在都有独立的预览和下载功能,同时所有任务的音频会自动合并到根目录的 all.wav 文件中。
将每节的分段语音放到对应章节的 separated 子文件夹
创建包含所有文件的 all.zip
将“下载所有音频文件”按钮改为下载 all.zip
主要修改点:
文件保存逻辑:在 dialogue_synthesis_function 中创建 separated 子文件夹
新增 create_all_zip 函数:创建包含所有文件的压缩包,保持目录结构
文件收集:在 collect_and_synthesize_queue 中收集所有生成的文件
下载按钮:修改为优先下载 all.zip
已实现的功能
导出当前配置
点击 “导出当前配置” 会把当前界面配置保存为 JSON 到 config/ 目录(文件名形如 soulx_podcast_config_YYYYMMDD_HHMMSS.json)
同时在界面里给出可下载的配置文件
导出后如需在下拉菜单中看到新文件,可点 “刷新列表”
导入配置(上传文件方式)
点击 “导入配置” 选择本地 JSON
点击 “加载配置” 应用到界面
上传的配置会自动保存到 config/ 目录(以 uploaded_... 前缀命名),后续可在下拉菜单中直接选中使用
导入配置(从 config 目录选择,新增)
在下拉菜单选择 config/ 下的配置文件
点击 “刷新列表” 更新下拉列表
点击 “加载选中配置” 载入并应用到界面
- 每个任务音频预览错误的指向了all.wave
- 合成的对话音频 也指向了错误的音频,应该是all.wave
原有功能保持不变:每个说话者片段仍然单独保存到 separated 文件夹
新增按行合并:同一行的文本(即使包含多个说话人如 [S1]xxx[S2]xxx),会按文本顺序合并成一个文件,保存到 sentences 文件夹
如果文本中有 <|pause:xxx|> 停顿标记,在合并时也会保留这些停顿
重构完成!原来的 2134 行 webui.py 已成功拆分为模块化的 webui/ 包。
新文件结构:
webui.py                    # 简化后的入口文件 (~80行)webui/├── __init__.py             # 包导出接口├── constants.py            # 常量和配置数据 (~150行)├── i18n.py                 # 国际化支持 (~260行)├── utils.py                # 通用工具函数 (~80行)├── file_manager.py         # 文件操作/ZIP创建 (~130行)├── synthesis.py            # 核心合成逻辑 (~350行)├── config_manager.py       # 配置导入/导出 (~250行)├── components.py           # UI组件创建 (~60行)├── callbacks.py            # UI回调函数 (~400行)└── interface.py            # 界面渲染 (~300行)
主要改进:
职责分离 - 每个模块负责单一职责
向后兼容 - 原有的 python webui.py --model_path ... 命令仍然有效
易于维护 - 修改某一功能只需编辑对应模块
无循环依赖 - 模块间依赖关系清晰
使用方式不变:
python webui.py --model_path /path/to/model
完成 WebUI 的 UI 和 UX 优化重构。主要改进包括全新的双栏布局、现代化的主题风格以及更清晰的功能分区。
以下是具体的优化内容:
1. 🎨 视觉与主题升级
现代化主题: 启用了 gr.themes.Soft 主题,使用 indigo(靛蓝)作为主色调,slate(板岩灰)作为次色调,界面更加柔和现代。
品牌识别: 在页面顶部添加了项目 Logo (assets/SoulX-Podcast-log.jpg),增强品牌感。
自定义 CSS: 注入了专门的 CSS 样式,优化了容器最大宽度、标题样式和按钮质感。
2. 📐 布局重构 (双栏设计)
为了解决原版单列过长的问题,采用了 7:3 的左右分栏布局:
左侧主要操作区 (70%): 专注于“内容创作”。
👥 说话人设置: 所有的说话人添加、配置、删除功能集中在此。
📝 对话内容: 文本输入框和预览区域。
右侧控制与输出区 (30%): 专注于“参数与结果”。
⚙️ 全局设置: 语言切换、随机种子 (Seed)、停顿设置等全局参数。
🚀 生成按钮: 增大了生成按钮的尺寸,使其更加醒目。
📤 输出结果: 音频播放器、文件下载和详细信息展示。
🛠️ 配置管理: 将配置导入/导出功能折叠在手风琴组件中,默认收起,保持界面整洁。
3. 💡 交互体验优化
层级分明: 使用 Markdown 标题 (###) 对各个功能区块进行了明确划分(如“说话人设置”、“对话内容”、“输出结果”)。
操作流线: 用户现在的视线流更加自然:左侧配置内容 -> 右侧调整参数 -> 点击生成 -> 原地查看结果,无需上下反复滚动。
修改的主要文件是 webui/interface.py。你可以启动 WebUI 查看新的界面效果。
+-------------------------------------------------------+-----------------------------+
|  标题栏                                         |  帮助文档   [⚙️配置管理▼]    |
+-------------------------------------------------------+-----------------------------+
|                                                       |                             |
|  [ 说话人设置区 (使用Tab切换,节省空间) ]               |  [ 当前输出结果 ]           |
|  +-------------------------------------------------+  |                             |
|  | [Tab:说话人1]  Tab:说话人2   Tab:说话人3  [+]   |  |  ▶️ 00:00 / 00:15  [下载]  |
|  +-------------------------------------------------+  |  -------------------------  |
|  |  说话人1参考音频: [ 上传按钮 ] (文件名.wav)      |  |  [|||||||||||] 波形图       |
|  |  说话人1参考文本: [ 输入框...                ]   |  |                             |
|  +-------------------------------------------------+  |  =========================  |
|                                                       |                             |
|  [ 对话内容输入 (核心区域,占据最大面积) ]              |  [ 历史记录列表 ]           |
|  +-------------------------------------------------+  |                             |
|  |                                                 |  |  1. 对话_003.wav  [播放]    |
|  |  在这里输入需要合成的文本内容...                 |  |  2. 对话_002.wav  [播放]    |
|  |  (支持多行,回车换行)                            |  |  3. 对话_001.wav  [播放]    |
|  |                                                 |  |                             |
|  +-------------------------------------------------+  |                             |
|                                                       |                             |
|  [ 底部操作栏 ]                                       |                             |
|  +----------------------------------------------+     |                             |
|  | 全局设置: [语言:中文▼] [Seed:1234] [停顿:0ms] |     |                             |
|  +----------------------------------------------+     |                             |
|                                                       |                             |
|         [ ============ 开始合成 ============ ]        |                             |
|             (大按钮,位于左侧底部,视觉终点)            |                             |
+-------------------------------------------------------+-----------------------------+
yegq added 15 commits December 14, 2025 06:13
- 添加指定数量的speaker
- 添加指定合成文本输入框
说话人设置模块:
折叠功能:将整个“说话人设置”区域放入可折叠的 Accordion 中,并且默认状态设置为折叠(open=False)。
备注名与动态标签:
在每个说话人配置中增加了一个“备注名”输入框。
添加了动态逻辑:当输入备注名时,对应的说话人 Tab 标签会自动更新为 S{编号}:{备注名}(例如 S1:佩奇);若无备注名,则保持原样 Speaker {编号}。
数据管理:更新了批量删除、配置导入/导出逻辑,以支持“备注名”字段的保存和同步。
配置管理模块:
布局调整:将“导入配置”区域调整到了“导出配置”的上方。
默认Tab:在“导入配置”中,将“选择预设”Tab 移到了第一个位置,使其成为默认显示的选项。
所有更改均已同步更新到回调函数(callbacks.py)和配置管理器(config_manager.py)中,确保了多语言切换、批量删除和配置保存加载功能的正常运行。
说话人设置标题问题
在 CSS 中添加规则,隐藏 Accordion 收起时的 Tabs 导航标签
确保标题行只显示固定的"👥 说话人设置 / Speakers"
合成文本输入框优化
默认行数从 12 行改为 6 行
最大行数设为 12 行(通过 max_lines=12)
超出内容可通过滚动查看
导出配置支持指定名称
在导出配置区域添加了"配置名称(可选)"输入框
修改 export_current_config 函数支持自定义文件名
如果留空则使用默认的时间戳命名
当前结果模块上方增加合成按钮
在右侧栏的"当前结果"模块上方添加了合成按钮
与左侧的生成按钮功能相同,方便用户在查看结果时再次生成
全局设置位置调整
将全局设置从左侧栏底部移动到右侧栏的配置管理下方
改为可收起的 Accordion 组件,默认收起状态
包含语言选择、Seed 和停顿时间设置
所有修改已完成并通过语法检查。可以启动 WebUI 测试这些优化。
  - 全局设置中的停顿(ms) 功能,放到对话内容模块中,和输入框数量在同一排
  - 说话人设置优化:
    - 添加说话人和批量删除等功能,放到该模块(说话人设置)的第一排。
    - 用于快速删除说话人功能的勾选说话人的功能现在需要切换到不同标签内,不方便操作,优化下
扩展 SPK_DICT:从 4 个增加到 10 个说话人,与 MAX_SPEAKERS=10 保持一致
添加边界检查:在所有使用 SPK_DICT[spk_idx] 或 SPK_DICT[spk] 的地方添加边界检查,提供更明确的错误信息
移除任务级别的进度更新:
移除了循环中每个任务的进度更新 progress_bar((task_idx, len(valid_texts)), desc=...)
只在开始时显示一次总体进度(如果有多个任务)
只在最后完成时更新一次总体进度
优化进度显示方式:
使用 track_tqdm=False 避免在每个文本框下显示进度条
只在有多个任务时显示总体进度
进度显示位置:
进度条只显示在生成按钮附近,不在每个文本框下面
每个文本框下面只显示音频预览组件,不显示进度信息
现在,每个合成文本框下面不会再显示进度条,只保留总体进度显示在生成按钮附近。每个文本框下面只显示音频预览组件,不显示任何进度信息。
日志文件会保存到输出文件夹下
任务间的停顿时间可以配置,并在合并音频时使用
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants