Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 339

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 392

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 394
Joyber 的博客

forks 列表

方式 1:直接访问 forks 列表链接(最快)

[https://github.com/ducbao414/win32.run/forks](https://github.com/ducbao414/win32.run/forks)

或者网络成员页(完整复刻网络图)

[https://github.com/ducbao414/win32.run/network/members](https://github.com/ducbao414/win32.run/network/members)

方式 2:页面按钮入口

  1. 在仓库主页,点右上角 Fork 按钮;
  2. 在弹出的创建 Fork 的弹窗上方,会出现蓝色文字:View existing forks,点它就进入全部复刻列表;
  3. 另一条路径:顶部菜单 Insights → Forks,同样是列表。

方式 3:API(适合批量拉取)

[https://api.github.com/repos/ducbao414/win32.run/forks](https://api.github.com/repos/ducbao414/win32.run/forks)

返回 JSON,包含所有 fork 仓库地址、star 数量、最后更新时间。

小提醒

  • GitHub 默认只展示公开 fork;如果用户 fork 之后把仓库设为私有,这条 fork 就不会出现在列表;
  • 列表会按最近更新排序,你可以挨个点进去看别人改的版本;
  • 虽然原仓库不能 star,但是这些 fork 副本正常可以 star。

如果你想要,我可以帮你挑这个项目里更新比较活跃、改动比较大的 fork。

分清三个完全不一样的“总大小”:

  1. GitHub API 给出仓库压缩存储体积(最省事,浏览器直接打开)
  2. 当前分支所有源码文件解压后的总和(不含 git 历史)
  3. 完整克隆之后,包含全部提交历史、LFS 文件的真实占用

① API(最快,适合这个仓库 ducbao414/win32.run)

访问:

[https://api.github.com/repos/ducbao414/win32.run](https://api.github.com/repos/ducbao414/win32.run)

找到字段 "size",单位是 KB,这个是 GitHub 内部压缩后的仓库体积(包含 git 历史,但 不包含 LFS 文件本身,LFS 只算指针)。

直接看这个仓库:

[https://api.github.com/repos/ducbao414/win32.run](https://api.github.com/repos/ducbao414/win32.run) | jq '.size'

算成 MB:除以 1024。

注意:页面主页本身不会直接显示这个数字,只能靠 API。

② 当前分支全部文件(不含历史,只算现在的文件)

用 contents API 遍历,或者用在线工具;也可以本地:

git clone --depth=1 [https://github.com/ducbao414/win32.run](https://github.com/ducbao414/win32.run)
cd win32.run
du -sh

这个就是:现在主干上所有文件解压之后的总大小。

如果你想列出每一个文件单独大小:

git ls-tree -r HEAD | awk '{print $5, $4}'

③ 完整仓库(带全部历史 + LFS)

git clone [https://github.com/ducbao414/win32.run](https://github.com/ducbao414/win32.run)
cd win32.run
git lfs pull
du -sh

同时查看 git 对象压缩体积:

git count-objects -vH

size-pack 就是 git 对象包体积。

重要坑(非常关键)

  • ✅ API size:每小时才刷新一次,不是实时;LFS 大文件不计入这个值,只记录小小的指针文本
  • ✅ --depth=1 浅克隆:只拿最新版本,体积最小
  • ✅ 如果项目有 Release 附件:Release 的二进制包不算在这个仓库 size 里面,单独算
  • ❌ GitHub 网页没有原生“一键展示全部文件累加总和”的按钮

专门给这个仓库

打开这个链接:

[https://api.github.com/repos/ducbao414/win32.run](https://api.github.com/repos/ducbao414/win32.run)

你可以直接看到:

"size": 31048

也就是大约 30.32 MB(仓库压缩体积)。

Ollama 不会直接识别丢进 blobs 文件夹的 gguf,不能简单复制进去;有两条路。

方案 A:给 Ollama 导入(如果你想用 ollama run / Qoder 调用)

  1. 找一个存放目录,例如:

    D:\ollama_local_models

    把 qwen2.5-coder-7b-instruct-q4_k_m.gguf 放这里。

  2. 在同一个文件夹新建文件,名字就叫 Modelfile(没有后缀),内容:

    FROM D:\ollama_local_models\qwen2.5-coder-7b-instruct-q4_k_m.gguf
    
    TEMPLATE "{{ if .System }}<|im_start|>system\n{{ .System }}<|im_end|>\n{{ end }}{{ if .Prompt }}<|im_start|>user\n{{ .Prompt }}<|im_end|>\n{{ end }}<|im_start|>assistant\n{{ .Response }}<|im_end|>"
    PARAMETER temperature 0.3
    PARAMETER num_ctx 8192
  3. 在这个目录打开 cmd,执行:

    ollama create qwen2.5-coder-local:7b -f Modelfile

    建好之后就可以:

    ollama run qwen2.5-coder-local:7b

    Qoder 里面 Model ID 填 qwen2.5-coder-local:7b。

⚠️:执行 create 的时候,Ollama 会把权重复制一份到它自己的 blob 存储,会占用双倍磁盘。

方案 B:直接给 llama.cpp server 使用(推荐,不复制)

随便放,比如 D:\gguf\qwen2.5-coder-7b-instruct-q4_k_m.gguf,启动命令直接指向这个路径,只用一份文件,省空间,适合你手动下载的 gguf。

llama-server -m D:\gguf\qwen2.5-coder-7b-instruct-q4_k_m.gguf -ngl 99 -c 8192 --port 8080

然后 Qoder 连 [http://127.0.0.1:8080/v1](http://127.0.0.1:8080/v1)。

补充

  • 不要手动往 %LOCALAPPDATA%\ollama\models\blobs 丢 gguf,无效,索引对不上。
  • 如果只是想省事,就继续用 ollama pull,不用手动下。
  • 如果是分卷 gguf,Modelfile 里面写:

    FROM D:\ollama_local_models\qwen2.5-coder-7b-instruct-q4_k_m-*.gguf

image.png

下面逐个说明,所有都是 Demucs 的预训练分离模型,后缀含义:

  • q = quantized(量化版):体积更小、速度更快,画质轻微下降,适合低配机器
  • ft = fine-tuned(微调版)
  • 6s = 6 轨分离
模型分离轨道特点适合场景
htdemucs4 轨:人声、鼓、贝斯、其他Demucs v4 默认模型,均衡,速度、质量折中日常分离,大多数歌曲首选
htdemucs_ft4 轨:人声、鼓、贝斯、其他在 htdemucs 基础上微调,4 轨里音质最好,速度稍慢需要高质量分轨、做翻唱、混音提取
htdemucs_6s6 轨:人声、鼓、贝斯、吉他、钢琴、其他额外分出吉他、钢琴;代价是单轨纯净度略低于上面两个需要单独提取吉他或者钢琴
hdemucs_mmi4 轨v3 老版本混合 Demucs,在 MusDB + 额外 800 首歌训练兼容老素材,一般不优先选
mdx4 轨MDX 挑战赛夺冠模型,仅在 MusDB HQ 数据集训练,速度较快早期热门模型,人声分离不错,但整体弱于 htdemucs 系列
mdx_extra4 轨mdx 的加强版,加入更多额外训练数据,纯净度优于原版 mdx如果 htdemucs 对某首歌翻车,可以换它尝试
mdx_q4 轨mdx 的量化压缩版本,占用显存更低、速度更快,音质小幅缩水显卡弱、内存小的电脑
mdx_extra_q4 轨mdx_extra 的量化版低配机器,想用 mdx_extra 时选择

快速选择建议

  • ✅ 追求最好质量:htdemucs_ft
  • ✅ 兼顾速度和质量:htdemucs
  • ✅ 想要单独分出吉他、钢琴:htdemucs_6s
  • ✅ 电脑配置低、显存小:优先带 _q 的模型
  • ✅ 前面几个模型分离效果差:试 mdx_extra

如果你主要用来提取鼓轨(正好你下拉框选的是“鼓声+其他”):优先 htdemucs_ft,鼓的分离干净度通常最优。

image.png

报错原因:这个 mp3 文件内部帧采样率乱跳,一部分帧是 32000,一部分突然跳到 44100,你这个音轨分离器内置的 Mp3FileReader 不支持这种动态变采样率的 MP3。

下面两条命令任选,第一条输出 WAV(最稳,推荐给 Demucs),第二条输出固定采样率 MP3。

把 input.mp3 换成你的源文件名。

方案 1|转成固定 44100 WAV(优先推荐)

ffmpeg -i input.mp3 -ar 44100 -ac 2 -c:a pcm_s16le -y fixed.wav
  • -ar 44100:强制固定采样率 44100
  • -ac 2:立体声
  • pcm_s16le:标准 16bit PCM,音轨分离器读取无压力

方案 2|重编码为固定采样率 MP3

ffmpeg -i input.mp3 -ar 44100 -ac 2 -c:a libmp3lame -b:a 320k -y fixed.mp3

如果你想统一成 32000,只需要把上面的 -ar 44100 改成 -ar 32000。

说明:不能用 -c:a copy,copy 会原样保留文件里错乱的采样帧,报错依旧,必须重新编码。

转完之后把 fixed.wav 丢进你这个音轨分离器就不会报这条错误。

abstract 抽象类(PHP)

作用

  1. 约束子类必须实现指定方法:抽象方法只有声明、没有实现,子类继承后必须重写这个抽象方法,否则子类也得标记为 abstract,不能实例化。用来统一接口规范。
  2. 可以放通用共用代码:和接口 interface 不一样,抽象类里面可以写已经实现好的普通方法、属性,子类直接复用。
  3. 本身不能 new 实例,只能被继承,用来做基类、模板骨架(模板方法模式非常常用)。

对比一句话:

  • interface:全部都是契约,不能写实现,一个类可以多实现
  • abstract class:一半契约(abstract方法)+一半现成代码,只能单继承

写法规则(PHP)

  1. 类前面加 abstract
  2. 抽象方法:前面 abstract,没有函数体,以分号结尾,不能有 {}
  3. 普通方法、属性、常量正常写,随便写实现
  4. 子类 extends 抽象类,必须全部实现父类所有抽象方法
  5. 抽象类不能 new

最简示例

<?php
abstract class CarrierBase
{
    // 抽象方法:子类必须实现
    abstract public function sendOrder(array $orderData): bool;
    abstract public function cancelOrder(int $orderId): bool;

    // 已经实现的公共方法,子类直接继承复用
    protected function log(string $msg): void
    {
        echo date('Y-m-d H:i:s') . ' ' . $msg . PHP_EOL;
    }
}

// 子类实现抽象类
class SelfCourierCarrier extends CarrierBase
{
    public function sendOrder(array $orderData): bool
    {
        $this->log('自有骑手接单:' . $orderData['id']);
        return true;
    }

    public function cancelOrder(int $orderId): bool
    {
        $this->log('自有骑手取消订单:' . $orderId);
        return true;
    }
}

// $base = new CarrierBase(); // 报错!抽象类不能实例化
$carrier = new SelfCourierCarrier();
$carrier->sendOrder(['id' => 1001]);

结合你上面跑腿运力场景的例子(贴合你的 CarrierInterface)

你现在是 CarrierInterface 接口;如果很多运力都共用一套日志、组装请求的逻辑,就适合改成抽象基类:

abstract class AbstractCarrier implements CarrierInterface
{
    // 公共通用能力,所有运力复用
    protected function buildOrderParam(array $raw): array
    {
        return [
            'order_no' => $raw['order_sn'],
            'addr_from' => $raw['from_address'],
            'addr_to' => $raw['to_address'],
        ];
    }
}

class SelfCourierCarrier extends AbstractCarrier
{
    public function dispatch(array $order): bool
    {
        $param = $this->buildOrderParam($order);
        // 自有骑手分发逻辑
        return true;
    }
}

class ThirdPartyCarrier extends AbstractCarrier
{
    public function dispatch(array $order): bool
    {
        $param = $this->buildOrderParam($order);
        // 调用UU/闪送接口
        return true;
    }
}

重点坑点

  1. 抽象方法不能写body:abstract public func(); ✅,带大括号 ❌
  2. 子类实现的方法,访问权限不能比父抽象方法更严格(父public,子类不能改成protected/private)
  3. 抽象类可以没有任何抽象方法(可以,但意义不大,仅用来禁止直接new基类)
  4. 一个类只能继承一个抽象类(PHP单继承)

什么时候选 abstract,什么时候选 interface

  • 多个子类有大量重复共用代码 → abstract 抽象类
  • 只定义调用契约、没有公共逻辑、一个类需要多套契约 → interface