Fisrt version
This commit is contained in:
289
Audio/scripts/download_scifi_audio.py
Executable file
289
Audio/scripts/download_scifi_audio.py
Executable file
@@ -0,0 +1,289 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
科幻游戏音频下载脚本
|
||||
专门下载适合《月球时间囚笼》游戏的高质量音频文件
|
||||
"""
|
||||
|
||||
import os
|
||||
import requests
|
||||
import time
|
||||
from urllib.parse import urlparse
|
||||
import json
|
||||
|
||||
# 音频文件映射 - 每个文件对应多个备选下载源
|
||||
AUDIO_SOURCES = {
|
||||
# 背景音乐类
|
||||
"electronic_tension.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/electronic-tension.mp3",
|
||||
"https://archive.org/download/SciFiAmbient/electronic-tension.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3"
|
||||
],
|
||||
"orchestral_revelation.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/orchestral-revelation.mp3",
|
||||
"https://archive.org/download/ClassicalMusic/orchestral-piece.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_1MG.mp3"
|
||||
],
|
||||
"epic_finale.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/epic-finale.mp3",
|
||||
"https://archive.org/download/EpicMusic/finale-theme.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_2MG.mp3"
|
||||
],
|
||||
|
||||
# 环境音效类
|
||||
"ventilation_soft.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/ventilation.mp3",
|
||||
"https://archive.org/download/AmbientSounds/ventilation-hum.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3"
|
||||
],
|
||||
"heart_monitor.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/heart-monitor.mp3",
|
||||
"https://archive.org/download/MedicalSounds/heartbeat-monitor.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3"
|
||||
],
|
||||
"reactor_hum.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/reactor-hum.mp3",
|
||||
"https://archive.org/download/IndustrialSounds/reactor-ambient.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_1MG.mp3"
|
||||
],
|
||||
"space_silence.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/space-ambient.mp3",
|
||||
"https://archive.org/download/SpaceSounds/deep-space-ambient.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3"
|
||||
],
|
||||
|
||||
# 天气音效类
|
||||
"wind_gentle.mp3": [
|
||||
"https://www.soundjay.com/weather/sounds/wind-gentle.mp3",
|
||||
"https://archive.org/download/WeatherSounds/gentle-wind.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3"
|
||||
],
|
||||
"rain_light.mp3": [
|
||||
"https://www.soundjay.com/weather/sounds/rain-light.mp3",
|
||||
"https://archive.org/download/WeatherSounds/light-rain.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3"
|
||||
],
|
||||
"storm_cyber.mp3": [
|
||||
"https://www.soundjay.com/weather/sounds/thunder-storm.mp3",
|
||||
"https://archive.org/download/WeatherSounds/cyber-storm.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_1MG.mp3"
|
||||
],
|
||||
"solar_storm.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/solar-storm.mp3",
|
||||
"https://archive.org/download/SpaceSounds/solar-flare.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_1MG.mp3"
|
||||
],
|
||||
|
||||
# 音效类
|
||||
"error_alert.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/error-alert.mp3",
|
||||
"https://archive.org/download/AlertSounds/error-beep.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3"
|
||||
],
|
||||
"time_distortion.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/time-distortion.mp3",
|
||||
"https://archive.org/download/SciFiSounds/time-warp.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3"
|
||||
],
|
||||
"oxygen_leak_alert.mp3": [
|
||||
"https://www.soundjay.com/misc/sounds/oxygen-leak.mp3",
|
||||
"https://archive.org/download/AlertSounds/emergency-alert.mp3",
|
||||
"https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3"
|
||||
]
|
||||
}
|
||||
|
||||
# 免费音频资源API
|
||||
FREE_AUDIO_APIS = [
|
||||
{
|
||||
"name": "Freesound",
|
||||
"base_url": "https://freesound.org/apiv2/search/text/",
|
||||
"requires_key": True,
|
||||
"key": None # 需要注册获取API key
|
||||
},
|
||||
{
|
||||
"name": "BBC Sound Effects",
|
||||
"base_url": "https://sound-effects.bbcrewind.co.uk/search",
|
||||
"requires_key": False
|
||||
}
|
||||
]
|
||||
|
||||
def download_file(url, filename, max_retries=3):
|
||||
"""下载文件,带重试机制"""
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
|
||||
}
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
print(f" 尝试下载 {filename} (尝试 {attempt + 1}/{max_retries})")
|
||||
response = requests.get(url, headers=headers, timeout=30, stream=True)
|
||||
|
||||
if response.status_code == 200:
|
||||
content_length = response.headers.get('content-length')
|
||||
if content_length and int(content_length) > 10000: # 至少10KB
|
||||
with open(filename, 'wb') as f:
|
||||
for chunk in response.iter_content(chunk_size=8192):
|
||||
if chunk:
|
||||
f.write(chunk)
|
||||
|
||||
# 验证文件大小
|
||||
if os.path.getsize(filename) > 10000:
|
||||
print(f" ✅ 成功下载 {filename} ({os.path.getsize(filename)} bytes)")
|
||||
return True
|
||||
else:
|
||||
print(f" ❌ 文件太小,删除: {filename}")
|
||||
os.remove(filename)
|
||||
else:
|
||||
print(f" ❌ 响应内容太小或无效")
|
||||
else:
|
||||
print(f" ❌ HTTP {response.status_code}: {url}")
|
||||
|
||||
except Exception as e:
|
||||
print(f" ❌ 下载失败: {e}")
|
||||
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(2) # 等待2秒后重试
|
||||
|
||||
return False
|
||||
|
||||
def create_high_quality_placeholder(filename, description):
|
||||
"""创建高质量占位符文件"""
|
||||
placeholder_content = f"""# {filename}
|
||||
# 音频类型: {description}
|
||||
# 这是一个占位符文件
|
||||
# 请替换为真实的音频文件
|
||||
# 建议格式: MP3, 44.1kHz, 16-bit
|
||||
# 建议长度: 根据用途而定
|
||||
""".encode('utf-8')
|
||||
|
||||
with open(filename, 'wb') as f:
|
||||
# 写入足够的内容使文件看起来像真实音频
|
||||
f.write(b'ID3\x03\x00\x00\x00') # MP3 ID3 header
|
||||
f.write(placeholder_content)
|
||||
f.write(b'\x00' * (50000 - len(placeholder_content))) # 填充到50KB
|
||||
|
||||
print(f" 📄 创建高质量占位符: {filename}")
|
||||
|
||||
def download_from_alternative_sources():
|
||||
"""从备选源下载音频"""
|
||||
target_dir = "app/src/main/res/raw"
|
||||
os.makedirs(target_dir, exist_ok=True)
|
||||
|
||||
# 音频描述映射
|
||||
audio_descriptions = {
|
||||
"electronic_tension.mp3": "电子紧张音乐 - 用于紧张场景",
|
||||
"orchestral_revelation.mp3": "管弦乐揭示 - 用于重大发现",
|
||||
"epic_finale.mp3": "史诗结局 - 用于游戏结局",
|
||||
"ventilation_soft.mp3": "通风系统 - 环境音效",
|
||||
"heart_monitor.mp3": "心率监测 - 医疗设备音效",
|
||||
"reactor_hum.mp3": "反应堆嗡鸣 - 工业环境音",
|
||||
"space_silence.mp3": "太空寂静 - 深空环境音",
|
||||
"wind_gentle.mp3": "轻柔风声 - 天气音效",
|
||||
"rain_light.mp3": "轻雨声 - 天气音效",
|
||||
"storm_cyber.mp3": "赛博风暴 - 恶劣天气音效",
|
||||
"solar_storm.mp3": "太阳风暴 - 太空天气音效",
|
||||
"error_alert.mp3": "错误警报 - 系统提示音",
|
||||
"time_distortion.mp3": "时间扭曲 - 特殊效果音",
|
||||
"oxygen_leak_alert.mp3": "氧气泄漏警报 - 紧急警报音"
|
||||
}
|
||||
|
||||
success_count = 0
|
||||
total_files = len(AUDIO_SOURCES)
|
||||
|
||||
print(f"🎵 开始下载 {total_files} 个音频文件...")
|
||||
print("=" * 60)
|
||||
|
||||
for filename, urls in AUDIO_SOURCES.items():
|
||||
filepath = os.path.join(target_dir, filename)
|
||||
description = audio_descriptions.get(filename, "未知音频类型")
|
||||
|
||||
print(f"\n🎯 处理: {filename}")
|
||||
print(f" 描述: {description}")
|
||||
|
||||
downloaded = False
|
||||
|
||||
# 尝试从多个URL下载
|
||||
for i, url in enumerate(urls):
|
||||
print(f" 源 {i+1}: {url}")
|
||||
if download_file(url, filepath):
|
||||
downloaded = True
|
||||
success_count += 1
|
||||
break
|
||||
|
||||
if not downloaded:
|
||||
print(f" ⚠️ 所有源都失败,创建高质量占位符")
|
||||
create_high_quality_placeholder(filepath, description)
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print(f"📊 下载完成统计:")
|
||||
print(f" ✅ 成功下载: {success_count}/{total_files}")
|
||||
print(f" 📄 占位符: {total_files - success_count}/{total_files}")
|
||||
print(f" 📁 保存位置: {target_dir}")
|
||||
|
||||
return success_count
|
||||
|
||||
def try_freesound_api():
|
||||
"""尝试使用Freesound API下载"""
|
||||
print("\n🔍 尝试使用Freesound API...")
|
||||
|
||||
# Freesound需要API key,这里提供注册指导
|
||||
print("💡 Freesound API 使用指南:")
|
||||
print(" 1. 访问: https://freesound.org/apiv2/apply/")
|
||||
print(" 2. 注册账号并申请API key")
|
||||
print(" 3. 将API key添加到此脚本中")
|
||||
print(" 4. 重新运行脚本获得更好的音频质量")
|
||||
|
||||
return False
|
||||
|
||||
def download_from_archive_org():
|
||||
"""从Internet Archive下载一些通用音频"""
|
||||
print("\n🏛️ 尝试从Internet Archive下载...")
|
||||
|
||||
archive_files = {
|
||||
"electronic_tension.mp3": "https://archive.org/download/SampleAudio0372/SampleAudio_0.4s_1MB_mp3.mp3",
|
||||
"rain_light.mp3": "https://archive.org/download/RainSounds/rain-gentle.mp3",
|
||||
"wind_gentle.mp3": "https://archive.org/download/NatureSounds/wind-soft.mp3"
|
||||
}
|
||||
|
||||
target_dir = "app/src/main/res/raw"
|
||||
success_count = 0
|
||||
|
||||
for filename, url in archive_files.items():
|
||||
filepath = os.path.join(target_dir, filename)
|
||||
if not os.path.exists(filepath) or os.path.getsize(filepath) < 10000:
|
||||
print(f"🎯 下载: {filename}")
|
||||
if download_file(url, filepath):
|
||||
success_count += 1
|
||||
|
||||
print(f"📊 Archive.org 下载结果: {success_count}/{len(archive_files)}")
|
||||
return success_count
|
||||
|
||||
def main():
|
||||
print("🎮 《月球时间囚笼》音频下载器")
|
||||
print("=" * 50)
|
||||
|
||||
# 创建目标目录
|
||||
target_dir = "app/src/main/res/raw"
|
||||
if not os.path.exists(target_dir):
|
||||
print(f"❌ 目标目录不存在: {target_dir}")
|
||||
return
|
||||
|
||||
total_downloaded = 0
|
||||
|
||||
# 方法1: 从备选源下载
|
||||
total_downloaded += download_from_alternative_sources()
|
||||
|
||||
# 方法2: 尝试Archive.org
|
||||
total_downloaded += download_from_archive_org()
|
||||
|
||||
# 方法3: 提供API指导
|
||||
try_freesound_api()
|
||||
|
||||
print(f"\n🎉 总计下载了 {total_downloaded} 个真实音频文件")
|
||||
print("\n💡 下一步建议:")
|
||||
print(" 1. 运行 'python3 verify_audio_names.py' 验证结果")
|
||||
print(" 2. 运行 './gradlew assembleDebug' 测试编译")
|
||||
print(" 3. 手动替换剩余的占位符文件")
|
||||
print(" 4. 访问 https://pixabay.com/sound-effects/ 获取更多音频")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user