别再手动试听了!用Python edge-tts写个脚本,一键试听并下载所有语音模型
·
用Python edge-tts实现语音模型批量试听与智能筛选方案
当面对edge-tts提供的数百种语音模型时,手动逐个试听不仅耗时费力,还容易错过最适合的声音。本文将介绍一套完整的Python自动化解决方案,帮助开发者快速筛选出符合需求的语音模型。
1. 环境准备与基础配置
在开始之前,我们需要确保Python环境已安装edge-tts库。这个轻量级的库提供了与微软Edge浏览器文本转语音服务的接口。
pip install edge-tts
创建项目目录结构也很重要,建议按以下方式组织:
/project_root
│── /audio_samples # 存放试听音频
│── /config # 配置文件
│── scripts.py # 主程序
基础配置文件中可以预设常用参数:
# config.py
DEFAULT_TEXT = "欢迎使用语音合成服务" # 试听文本
OUTPUT_DIR = "audio_samples" # 输出目录
SAMPLE_RATE = 24000 # 音频采样率
2. 获取所有可用语音模型
edge-tts提供了获取所有可用语音模型的接口,我们可以利用这个功能建立完整的模型数据库。
import edge_tts
async def list_voices():
voices = await edge_tts.VoicesManager.create()
return voices.voices
这个函数返回的语音模型列表包含每个模型的详细信息,我们可以将其转换为更易处理的DataFrame格式:
import pandas as pd
def voices_to_dataframe(voices_list):
data = []
for voice in voices_list:
data.append({
'Name': voice['Name'],
'Gender': voice['Gender'],
'Language': voice['Locale'].split('-')[0],
'Locale': voice['Locale']
})
return pd.DataFrame(data)
3. 批量生成试听音频
手动试听每个模型效率极低,我们可以编写自动化脚本批量生成试听样本。
import os
from pathlib import Path
async def generate_sample(text, voice, output_dir):
output_path = Path(output_dir) / f"{voice['Name']}.mp3"
communicate = edge_tts.Communicate(text, voice['Name'])
await communicate.save(output_path)
return output_path
批量处理所有语音模型的完整函数:
async def batch_generate_samples(voices_df, text, output_dir):
os.makedirs(output_dir, exist_ok=True)
results = []
for _, voice in voices_df.iterrows():
try:
path = await generate_sample(text, voice, output_dir)
results.append({'Name': voice['Name'], 'Path': path, 'Status': 'Success'})
except Exception as e:
results.append({'Name': voice['Name'], 'Status': f'Failed: {str(e)}'})
return pd.DataFrame(results)
4. 智能筛选与分类系统
有了所有语音模型的试听样本后,我们可以实现多种筛选方式。
4.1 按语言筛选
def filter_by_language(voices_df, language_code):
return voices_df[voices_df['Language'] == language_code]
4.2 按性别筛选
def filter_by_gender(voices_df, gender):
return voices_df[voices_df['Gender'] == gender]
4.3 高级复合筛选
def advanced_filter(voices_df, language=None, gender=None, name_contains=None):
filtered = voices_df.copy()
if language:
filtered = filtered[filtered['Language'] == language]
if gender:
filtered = filtered[filtered['Gender'] == gender]
if name_contains:
filtered = filtered[filtered['Name'].str.contains(name_contains)]
return filtered
5. 自动化评估与选择建议
我们可以通过分析音频特征来提供智能推荐。
import librosa
import numpy as np
def analyze_audio_features(audio_path):
y, sr = librosa.load(audio_path)
features = {
'duration': librosa.get_duration(y=y, sr=sr),
'tempo': librosa.feature.tempo(y=y, sr=sr)[0],
'spectral_centroid': np.mean(librosa.feature.spectral_centroid(y=y, sr=sr)),
'zero_crossing_rate': np.mean(librosa.feature.zero_crossing_rate(y))
}
return features
基于特征分析的推荐系统:
def recommend_voices(audio_features_df, target_features):
# 计算每个语音与目标特征的相似度
similarities = []
for _, row in audio_features_df.iterrows():
similarity = 0
for feature in target_features:
similarity += abs(row[feature] - target_features[feature])
similarities.append(similarity)
audio_features_df['Similarity'] = similarities
return audio_features_df.sort_values('Similarity')
6. 完整工作流实现
将上述功能整合成一个完整的解决方案:
async def full_workflow():
# 1. 获取所有语音模型
voices = await list_voices()
voices_df = voices_to_dataframe(voices)
# 2. 批量生成试听音频
results_df = await batch_generate_samples(
voices_df,
DEFAULT_TEXT,
OUTPUT_DIR
)
# 3. 合并结果
full_df = pd.merge(voices_df, results_df, on='Name')
# 4. 分析音频特征
audio_features = []
for _, row in full_df[full_df['Status'] == 'Success'].iterrows():
features = analyze_audio_features(row['Path'])
features['Name'] = row['Name']
audio_features.append(features)
audio_features_df = pd.DataFrame(audio_features)
# 5. 保存结果
full_df.to_csv('voice_catalog.csv', index=False)
audio_features_df.to_csv('audio_features.csv', index=False)
return full_df, audio_features_df
7. 实用技巧与优化建议
在实际使用中,有几个技巧可以提升效率:
- 增量处理 :记录已处理的语音模型,避免重复生成
- 并行处理 :使用asyncio.gather加速批量生成
- 缓存机制 :将语音模型列表和特征分析结果缓存到本地
async def parallel_generate_samples(voices_df, text, output_dir):
tasks = []
for _, voice in voices_df.iterrows():
task = generate_sample(text, voice, output_dir)
tasks.append(task)
return await asyncio.gather(*tasks, return_exceptions=True)
对于大型项目,可以考虑将这些功能封装成类:
class VoiceModelManager:
def __init__(self):
self.voices_df = None
self.audio_features_df = None
async def initialize(self):
self.voices_df = await self.load_voices()
async def load_voices(self):
voices = await edge_tts.VoicesManager.create()
return self.voices_to_dataframe(voices.voices)
# 其他方法...
这套方案不仅适用于个人项目,也可以集成到更大的系统中。例如,在需要动态选择语音模型的场景下,可以根据用户偏好实时筛选最合适的语音。
更多推荐


所有评论(0)