随机检测

华东理工大学能源与动力工程专业外语单词随机检测
也可以自己部署:https://gitee.com/chinazyq/zywy-bdc/
http://zywy.bestzyq.cn/

有意思的背单词网站

https://wordforest.cn/
导入单词书即可使用:http://zywy.bestzyq.cn/words.csv

合成音频

逻辑

这个代码的逻辑是读取包含单词和其对应的中文含义的CSV文件,生成并合并对应的语音文件,最终导出为一个音频文件。具体步骤如下:

  1. 读取 CSV 文件:从 CSV 文件中读取单词和其中文含义,并将它们存储在一个列表中。

  2. 初始化空的音频对象:创建一个空的 AudioSegment 对象,用于存储最终合并的音频。

  3. 初始化 pyttsx3:初始化 pyttsx3 语音引擎并设置语速和音量。

  4. 处理每个单词

    • 生成中文发音:使用 pyttsx3 生成中文含义的语音,并保存为 temp_cn.wav 文件。
    • 下载英文发音:使用 requests 请求有道词典 API 获取单词的英文发音,并将其保存为 temp_en.mp3 文件。
    • 检查文件完整性:检查下载的 temp_en.mp3 文件是否存在且非空。
    • 转换 MP3 到 WAV:使用 ffmpegtemp_en.mp3 转换为 temp_en.wav
    • 加载音频文件:加载 temp_cn.wavtemp_en.wav 文件到 AudioSegment 对象中。
    • 合并音频:将中文和英文发音合并到 combined 音频对象中,并在两个音频之间和每对音频之间添加短暂的静音。
  5. 添加延迟:在处理每个单词后,添加延迟以防止请求过快导致的阻断。

  6. 删除临时文件:处理完每个单词后,删除临时生成的 MP3 和 WAV 文件。

  7. 导出最终音频文件:将合并后的 combined 音频对象导出为 combined_audio.mp3 文件。

  8. 清理:最后删除临时生成的中文 WAV 文件。

这个逻辑通过使用 pyttsx3 和有道词典 API 生成每个单词及其中文含义的语音,并将它们合并到一个音频文件中,实现了将单词列表转化为有声词汇表的功能。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import pyttsx3
from pydub import AudioSegment
import csv
import requests
import time
import os
import subprocess

# 读取 CSV 文件
words = []
with open('words.csv', 'r', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
words.append((row[0], row[1])) # (word, meaning)

# 创建一个空的 AudioSegment 对象
combined = AudioSegment.silent(duration=0)

# 初始化 pyttsx3
engine = pyttsx3.init()
engine.setProperty('rate', 150) # 设置语速
engine.setProperty('volume', 1) # 设置音量

# 生成中文和英文发音并合并到一个音频文件中
for word, meaning in words:
# 生成中文发音
engine.save_to_file(meaning, 'temp_cn.wav')
engine.runAndWait()
audio_cn = AudioSegment.from_wav('temp_cn.wav')

# 请求有道接口并添加延迟
response = requests.get(f'https://dict.youdao.com/dictvoice?type=1&audio={word}')
if response.status_code == 200:
with open('temp_en.mp3', 'wb') as f:
f.write(response.content)

# 检查文件是否下载成功
if os.path.getsize('temp_en.mp3') > 0:
try:
# 使用 ffmpeg 将 MP3 转换为 WAV
subprocess.run(['ffmpeg', '-i', 'temp_en.mp3', 'temp_en.wav'])
audio_en = AudioSegment.from_wav('temp_en.wav')
# 合并中文和英文发音
combined += audio_cn + AudioSegment.silent(duration=500) + audio_en + AudioSegment.silent(duration=1000)
except Exception as e:
print(f"Error processing {word}: {e}")
else:
print(f"Downloaded file for {word} is empty.")
else:
print(f"Failed to download audio for {word}, status code: {response.status_code}")

# 删除临时 MP3 和 WAV 文件
if os.path.exists('temp_en.mp3'):
os.remove('temp_en.mp3')
if os.path.exists('temp_en.wav'):
os.remove('temp_en.wav')

# 添加延迟,防止请求过快
time.sleep(1) # 延迟1秒

# 保存最终的音频文件
combined.export('combined_audio.mp3', format='mp3')

# 删除临时中文 WAV 文件
if os.path.exists('temp_cn.wav'):
os.remove('temp_cn.wav')

合成音频