aardio 文档

aardio 范例: 一个 MP3 URL,播放器只需要打开地址;此例用 WMPlayer.OCX 作普通消费者。

// 一个 MP3 URL,播放器只需要打开地址;此例用 WMPlayer.OCX 作普通消费者。
import win.ui;
import web.edgeTextToSpeech;
import wsock.tcp.httpStreamMp3;
import com.wmPlayer;
/*DSG{{*/
var winform = win.form(text='TTS \u2192 内存 HTTP URL';right=679;bottom=299)
winform.add(
editText={cls="edit";text="你好。这段语音通过本机 HTTP 地址从内存传给播放器,不需要先保存为音频文件。";left=16;top=16;right=664;bottom=170;anchors={left=1;top=1;right=1;bottom=1};edge=1;multiline=1;z=1};
start={cls="button";text="生成并播放";left=16;top=184;right=144;bottom=224;anchors={left=1;bottom=1};z=2};
status={cls="plus";text="音频保留到停止、下一次生成或关闭窗口。";left=288;top=188;right=664;bottom=226;align="left";anchors={left=1;right=1;bottom=1};z=4};
stop={cls="button";text="停止 / 释放";left=156;top=184;right=274;bottom=224;anchors={left=1;bottom=1};z=3};
url={cls="edit";left=16;top=262;right=664;bottom=286;anchors={left=1;right=1;bottom=1};edge=1;readonly=1;z=6};
urlLabel={cls="static";text="MP3 URL(可复制给其他播放器):";left=16;top=239;right=440;bottom=258;anchors={left=1;bottom=1};z=5}
)
/*}}*/

var engine=web.edgeTextToSpeech();
var task,stream;
com.wmPlayer.settings.autoStart=false;

// 唯一的清理入口,可以重复调用。
// 停播放器和关闭 URL 是两件事:关闭 URL 不会撤回播放器已经缓存的声音。
var stop=function(){
    com.wmPlayer.controls.stop();
    com.wmPlayer.close();
    if(task) task.cancel();
    if(stream) stream.close();
    task,stream=null,null;
    winform.url.text="";
};

winform.start.oncommand=function(){
    var text=string.trim(winform.editText.text);
    if(!#text){winform.status.text="请输入要朗读的文字。";return;}
    stop();

    var err;
    stream,err=wsock.tcp.httpStreamMp3();
    if(!stream){winform.status.text=tostring(err);return;}

    task,err=engine.synthesize({text=text;boundary="none"},stream); // 音频直接写入 URL
    if(!task){stop();winform.status.text=err.message;return;}

    winform.url.text=stream.url;
    // 换播放器只需替换这两句,不用修改 HTTP 服务或 TTS。
    com.wmPlayer.URL=stream.url;
    com.wmPlayer.controls.play();
};
winform.stop.oncommand=function(){
    stop();
    winform.status.text="已停止,音频内存和 URL 已释放。";
};
winform.onClose=function(){stop();};

// 状态直接读 stream 属性。
winform.setInterval(function(){
    if(!stream) return;
    select(stream.state){
        case "open" {winform.status.text="正在生成,已收到 " ++ stream.size ++ " 字节;播放器按自己的策略缓冲……";}
        case "finished" {winform.status.text="已生成 " ++ stream.size ++ " 字节;URL 仍然保留。";}
        case "failed" {winform.status.text="生成失败:" ++ tostring(stream.error);}
    }
},200);

winform.show();
win.loopMessage();

Markdown 格式