能否将音频文件存入DataFrame并调用?附R语言音频存储需求
把音频存入DataFrame并调用的实现方法
先提个关键问题:你原来的代码里,download.file返回的是下载状态码(0=成功,1=失败),不是音频数据本身。要把音频存进DataFrame,得先把下载好的MP3加载成可存储的对象(比如tuneR的Wave对象),再存进去。
完整实现代码
library(tuneR) # 基础配置 verb_formen <- "https://www.verbformen.de/konjugation/infinitiv/" verb_list <- c("analysieren", "formen", "erstellen") # 用来存音频对象的列表 audio_objects <- list() # 下载+加载音频 for (verb in verb_list) { # 拼接音频链接和本地文件名 verb_link <- paste0(verb_formen, verb, ".mp3") local_file <- paste0("audio_", verb, ".mp3") # 仅当文件未下载时执行下载,避免重复操作 if (!file.exists(local_file)) { download_status <- download.file(verb_link, local_file, mode = "wb") if (download_status != 0) { warning(paste(verb, "音频下载失败")) audio_objects[[verb]] <- NULL next } } # 将MP3文件加载为Wave对象(tuneR支持MP3,需确保依赖已安装) audio_wave <- readMP3(local_file) audio_objects[[verb]] <- audio_wave } # 转换为DataFrame:一列存动词,一列存音频对象 # 用I()包裹音频列表,防止DataFrame自动拆分对象结构 audio_df <- data.frame( verb = names(audio_objects), audio = I(audio_objects) ) # 查看DataFrame结构 print(audio_df)
调用DataFrame里的音频
直接提取Wave对象,用tuneR::play()即可播放:
# 播放第一个动词的音频 play(audio_df$audio[[1]]) # 播放指定动词的音频(比如"formen") target_audio <- audio_df$audio[audio_df$verb == "formen"][[1]] play(target_audio)
其他可行存储方案
如果不想存Wave对象,也可以把音频读成二进制raw向量存入DataFrame,后续可还原为文件再播放:
# 存储二进制raw向量的实现 audio_raw_list <- list() for (verb in verb_list) { local_file <- paste0("audio_", verb, ".mp3") if (file.exists(local_file)) { # 读取文件为二进制raw向量 audio_raw_list[[verb]] <- readBin(local_file, "raw", file.info(local_file)$size) } } raw_audio_df <- data.frame( verb = names(audio_raw_list), audio_raw = I(audio_raw_list) ) # 从raw向量还原音频并播放(以"erstellen"为例) raw_data <- raw_audio_df$audio_raw[raw_audio_df$verb == "erstellen"][[1]] temp_file <- tempfile(fileext = ".mp3") writeBin(raw_data, temp_file) play(readMP3(temp_file)) unlink(temp_file) # 用完删除临时文件
更轻量的替代方案
如果音频文件数量多、体积大,直接存DataFrame会占用大量内存,建议只存储文件路径,需要时再加载:
# 仅存储文件路径的轻量方案 audio_path_df <- data.frame( verb = verb_list, audio_path = paste0("audio_", verb_list, ".mp3") ) # 播放时直接加载对应文件 play(readMP3(audio_path_df$audio_path[audio_path_df$verb == "analysieren"]))
内容的提问来源于stack exchange,提问作者jbozen
相关产品推荐
相关产品推荐

