You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下使用Lua从URL下载MP3生成空文件的技术问题

解决Lua下载MP3文件为空的问题

嘿,我一眼就看出问题所在了——你现在只是把MP3的URL字符串直接写入了文件,而没有真正去下载这个URL对应的音频内容!这就是为什么生成的test.mp3是空的(或者打开后其实是一串网址文本)。

问题根源

你的代码里,voice.result.Voice_link返回的是音频文件的在线地址,比如类似https://xxx.com/yyy.mp3这样的字符串,而不是MP3文件的二进制数据。直接把这个字符串写入文件,自然得不到有效的音频文件。

修正后的解决方案

你需要再次发起HTTP请求,获取Voice_link对应的二进制内容,然后以二进制写入模式保存到文件中。假设你用的是Lua的luasec库提供的HTTPS.request(和原代码一致),修正后的完整代码如下:

local sound = HTTPS.request('https://hozory.com/translate/?target='..matches[1]..'&text='..text)
local voice = json:decode(sound)
if voice.result.Voice_link ~= "false" then
    -- 发起请求获取MP3的二进制内容
    local mp3_content, status_code = HTTPS.request(voice.result.Voice_link)
    if status_code == 200 and mp3_content then
        -- 以二进制写入模式打开文件(必须用'wb'而非'w')
        local f = assert(io.open('test.mp3', 'wb'))
        f:write(mp3_content)
        f:close()
        print("MP3文件下载保存成功!")
    else
        print("下载MP3失败,状态码:"..tostring(status_code))
    end
else
    print("没有获取到有效的音频链接")
end

关键注意点

  • 用'wb'模式写文件:Lua中'w'是文本模式,写入二进制音频时必须用'wb',否则会因为换行符转换等问题损坏文件。
  • 增加请求状态校验:通过status_code == 200确认HTTP请求成功,避免把错误响应写入文件。
  • 保留错误处理:assert可以捕获文件打开失败的情况,同时处理HTTP请求返回空内容的场景。

额外提示

如果你的Ubuntu环境还没安装luasec库(提供HTTPS请求能力),先执行以下命令安装:

sudo apt-get install lua-sec

同时确保当前用户对目标文件夹有写入权限,否则会出现文件无法创建的错误。

内容的提问来源于stack exchange,提问作者Shafiq Sadat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:28:08