我给 Laravel AI 写了个千问驱动,文本、语音、图像、视频全打通

0 阅读1分钟

上周刷 Laravel 的动态,看到官方出了个 AI 框架,就叫 laravel/ai。

文本对话、向量嵌入、语音、画图,接口全部定义好了,还给了统一的 Facade。

我的第一反应是,PHP 终于有官方的 AI 入口了。

第二反应是,默认驱动清一色 OpenAI。

不是 OpenAI 不好。是国内用起来太别扭,网络要折腾,账单算美元,出了问题连个能中文沟通的工单都没有。

对国内开发者来说,更顺手的选择其实是通义千问。阿里云百炼平台,国内直连,按量付费,发票齐全。

所以我花了一个周末,给 laravel/ai 写了个千问驱动。

今天把它开源出来,包名叫 laravel-ai-qwen。

01

一个包,五种能力

这个包做的事,一句话能说清。

让 Laravel 应用通过一个驱动,用上阿里云百炼的全套千问能力。

具体五样,一屏看清楚。

💬文本对话OpenAI 兼容模式
官方用法零改动🧭向量嵌入text-embedding-v4
维度可配🔊语音合成Qwen3-TTS
多音色可选🎨图像生成Qwen Image
生成加改图🎬视频生成Wan 万相
文生加图生

前三样,官方定义了接口契约,我负责实现。文本和向量直接继承官方的 OpenAI 兼容驱动,对接百炼的 Compatible Mode,用法和官方文档一模一样。

语音和图像这两样,官方有契约,但 OpenAI 那套参数和百炼对不上,我做了完整的映射。

视频官方连契约都还没有。我在驱动上直接加了两个方法,把异步任务的创建和轮询封装好了。

02

装起来,两分钟

环境要求是 PHP 8.4、Laravel 12 以上,外加 laravel/ai 0.10.3。

然后一行命令。

composer require larva/laravel-ai-qwen

Laravel 的 Package Discovery 会自动注册 qwen 驱动,ServiceProvider 不用手动加。

接着在 config/ai.php 的 providers 里加一段。

'providers' => [ 'qwen' => [ 'driver' => 'qwen', 'key' => env('DASHSCOPE_API_KEY'), // 文本、向量走 OpenAI 兼容接口 'url' => env('QWEN_BASE_URL', 'https://dashscope.aliyuncs.com/compatible-mode/v1'), // 语音、图像、视频走百炼原生接口 'api_url' => env('QWEN_API_URL', 'https://dashscope.aliyuncs.com/api/v1'), ], ],

这里有两个 URL,它们不是一回事。

url 走 OpenAI 兼容接口,管文本和向量。api_url 走百炼原生接口,管语音、图像、视频。

为什么要拆开。因为百炼的多模态能力不在兼容模式里,必须调原生端点。填错一个,多模态就全军覆没。

最后在 .env 里填上百炼控制台拿的 API Key,收工。想让千问当默认提供方,加一行 AI_DEFAULT_PROVIDER=qwen 就行。

03

让应用开口说话

文本和向量没什么可讲的,官方文档怎么用就怎么用,provider 换成 qwen 完事。

真正补的课,是多模态这三样。先看语音合成,接的是 Qwen3-TTS。

use Laravel\Ai\Ai; $audio = Ai::audioProvider('qwen')->audio('你好,欢迎使用通义千问。'); // 直接存到存储盘 $audio->store('greeting.wav', 'public');

音色上有个贴心的设计。SDK 里的占位音色 default-female 和 default-male,会自动映射到配置里的默认女声 Cherry 和默认男声 Ethan。想换音色,直接传千问的音色名,比如 Serena。

还有个坑提前说了。Qwen3-TTS 不支持 OpenAI 的 instructions 参数,情绪和语气要靠音色和文本本身控制,传了也会被忽略。

非流式响应里 Base64 音频和 24 小时有效的 URL 都有,驱动优先用 Base64,省一次下载。

04

一句话,一张图

图像这块接的是 Qwen Image,生成和编辑都支持。

$image = Ai::imageProvider('qwen')->image( '一只在草地上奔跑的柴犬,阳光明媚,摄影风格', size: '3:2', ); $image->store('shiba.png', 'public');

尺寸支持 1:1、2:3、3:2、16:9、9:16 这些比例,也支持直接写像素。不显式指定的话,quality 参数会映射成分辨率档位,low 是 1024,medium 和 high 是 2048。

改图也简单,把参考图传进去就行。远端 URL、本地文件、存储盘文件、Base64,四种都认。

use Laravel\Ai\Files\RemoteImage; $image = Ai::imageProvider('qwen')->image( '把背景换成海边', [new RemoteImage('https://example.com/ref.png')], );

远端图直接透传 URL,本地文件自动转成 Base64 Data URI 再提交。这个转换是驱动默默干的,调用方无感。

05

视频生成,也安排上了

视频这块得多说两句。

百炼的视频生成是异步任务。提交,拿 task_id,然后轮询,整个过程可能要几分钟。

laravel/ai 目前还没有 VideoProvider 契约,所以我把两个方法直接挂在了驱动实例上。

$provider = Ai::instance('qwen'); // 创建文生视频任务 $task = $provider->createVideoTask('一只猫在草地上奔跑,镜头缓慢推进', [ 'duration' => 5, // 时长,秒 'resolution' => '1080P', // 480P / 720P / 1080P 'ratio' => '16:9', // 画幅比例 ]); // 轮询任务结果 $result = $provider->getVideoResult($task['task_id']); if ($result['task_status'] === 'SUCCEEDED') { $videoUrl = $result['video_url']; }

文生视频传一段描述就行。图生视频支持首帧和尾帧,万相 3.0 用 media 数组传。

时长、分辨率、画幅、水印、提示词智能改写,都在 options 里配。

有一件事必须加粗提醒。

**任务 ID 和生成出来的视频 URL,有效期都只有 24 小时。**跑完任务记得及时下载。别问我怎么知道的。

06

藏在细节里的功夫

这个包不大,但细节没少花心思。

异常处理沿用 Laravel AI 的官方异常体系。限流、余额不足、服务过载,各有各的异常类,调用处统一捕获,不用为千问单写一套。

图像的智能改写和水印开关收进了配置项,不用每次调用都传。所有配置都能用环境变量覆盖,多环境部署不用改代码。

新加坡等海外地域,把两个 URL 换成对应地域的地址就能用。

07

最后想说的话

说点题外话。

这两年总有人说 PHP 老了。可我看到的 Laravel 社区,动作一直没停,连官方 AI 框架都安排上了。

语言哪有什么新旧。

大模型时代,拼的是生态里有没有人把路修通。

这个包,就是我修的一小段路。

MIT 协议,随便用。觉得有用,点个 Star。有想法,提 Issue。想一起修,PR 随时欢迎。

GitHub 搜 laravel-ai-qwen,第一个就是。

包地址 Packagist 搜 larva/laravel-ai-qwen
源码地址 github.com/larva-cool/laravel-ai-qwen
文档在 README,安装到跑通只要两分钟