本文目录导读:

在 PHP 项目中实现情感语音合成(Emotional TTS),由于 PHP 本身不擅长音频处理和 AI 模型推理,通常需要调用第三方云 API(最推荐)或通过中间件(如 Node.js/Python)调用本地的 AI 模型。
以下是几种主流实现方案,从简单到深度定制排列:
调用云端 TTS API(最推荐,成本低效果好)
几乎所有的云厂商都提供了带情感控制的语音合成接口,你只需要在 PHP 中发送 HTTP 请求即可。
阿里云(智能语音交互)
支持 SSML(语音合成标记语言),可通过 <say-as> 或 <emphasis> 标签控制情感,或直接使用“情感/场景”参数。
PHP 示例(使用阿里云 PHP SDK):
require_once 'vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
// 初始化客户端
AlibabaCloud::accessKeyClient('your-access-key-id', 'your-access-key-secret')
->regionId('cn-shanghai')
->asDefaultClient();
try {
$result = AlibabaCloud::nlsFiletrans()
->v20180817()
->createTask()
->withTask(json_encode([
'appkey' => 'your-appkey',
'format' => 'wav',
'sample_rate' => 16000,
'enable_volume' => true,
// 关键:情感参数
'emotion' => 'happy', // 可选:happy, sad, angry, fearful, surprise, calm, neutral, disgust
'voice' => 'xiaoyun', // 选择发音人
'text' => '今天天气真好啊,我们一起出去玩吧!',
'speech_rate' => 0,
'pitch_rate' => 0
]))
->request();
print_r($result->toArray());
} catch (ClientException $e) {
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
echo $e->getErrorMessage() . PHP_EOL;
}
腾讯云(语音合成)
支持 SSML <emotion> 标签或 EmotionCategory 参数。
require_once 'vendor/autoload.php';
use TencentCloud\Common\Credential;
use TencentCloud\Tts\V20190823;
use TencentCloud\Tts\V20190823\Models;
$cred = new Credential("your-secret-id", "your-secret-key");
$client = new Tts\V20190823\TtsClient($cred, "ap-guangzhou");
$req = new Models\TextToVoiceRequest();
$params = '{"Text":"你好,世界!","SessionId":"session-123","ModelType":1,"VoiceType":101001,"EmotionCategory":"happy"}';
// emotion 参数:happy(高兴)、sad(悲伤)、angry(愤怒)、fear(恐惧)、surprise(惊讶)、disgust(厌恶)、neutral(中性)
$req->fromJsonString($params);
$resp = $client->TextToVoice($req);
print_r($resp->toJsonString());
使用 SSML 精细控制
几乎所有云 API 都支持 SSML,SSML 可以让你在文本中标记情感、语速、重音等。
以阿里云为例的 SSML 文本:
<speak> 今天天气真好啊,<emphasis level="strong">我们一起出去玩吧!</emphasis> <prosody rate="-10%" pitch="+20%">我好开心呀!</prosody> </speak>
<emphasis>:强调,间接表达情感。<prosody>:控制语速、音调。- 部分厂商有专门的
<emotion>
本地推理(离线部署,适合敏感数据和定制)
如果无法使用云服务,或需要高度定制的情感模型,可以:
- 在服务器上部署 Python 推理服务(如 Flask/FastAPI)
- PHP 通过 cURL 或 Guzzle 调用该服务
部署 Python 情感 TTS 服务(使用 Coqui TTS 或 GPT-SoVITS)
# app.py (Flask)
from flask import Flask, request, send_file
import io
from TTS.api import TTS
app = Flask(__name__)
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False)
@app.route('/tts', methods=['POST'])
def synthesize():
data = request.json
text = data['text']
emotion = data.get('emotion', 'neutral') # 不是所有模型支持自定义情感
# 有些模型通过 reference_audio 体现情感,需要传入情感参考音频
reference_wav = data.get('reference_audio', 'neutral.wav')
wav = tts.tts(text=text, speaker_wav=reference_wav, language="zh-cn")
buf = io.BytesIO()
tts.save_wav(wav, buf)
buf.seek(0)
return send_file(buf, mimetype='audio/wav')
if __name__ == '__main__':
app.run(port=5000)
PHP 调用该服务
// PHP 端
function getEmotionalTTS($text, $emotion='neutral') {
$client = new GuzzleHttp\Client();
$response = $client->post('http://localhost:5000/tts', [
'json' => [
'text' => $text,
'emotion' => $emotion,
'reference_audio' => $emotion . '.wav' // 预先录好的情感参考音频
]
]);
return $response->getBody()->getContents(); // 返回音频二进制数据
}
// 使用
$audioData = getEmotionalTTS('我今天非常高兴!', 'happy');
file_put_contents('output.wav', $audioData);
纯 PHP 实现(极不推荐)
PHP 有 ext-sox 或 exec() 调用本地 SoX 工具(音频处理)配合 eSpeak(语音合成),但 eSpeak 是机械音,无法实现情感,这种方式音质极差,仅适合测试。
$text = "你好世界";
$escaped = escapeshellarg($text);
// 调用 eSpeak 生成 wav(无情感)
shell_exec("espeak '$escaped' -w output.wav");
// 然后用 SoX 改变音调(模拟一点情绪变化,效果很差)
shell_exec("sox output.wav happy.wav pitch 300"); // 提升音高模拟高兴
总结与选型建议
| 需求场景 | 推荐方案 | 实现难度 | 效果 | 成本 |
|---|---|---|---|---|
| 生产环境,效果好 | 阿里云/腾讯云 API + SSML | 简单 | 优秀 | 按调用量付费 |
| 需要离线部署 | Python 推理服务 + PHP 调用 | 中等 | 良好(需好模型) | 需 GPU 服务器 |
| 简单原型或测试 | 云 API 免费额度 | 简单 | 良好 | 通常有免费额度 |
| 最炫酷情感(如笑、哭) | GPT-SoVITS + 参考音频 | 较复杂 | 极好(特定场景) | 需调优 |
最佳实践路径:
- 先用阿里云/腾讯云的免费额度验证效果
- 如果需要精细情感(如从“愤怒”变成“悲伤”),使用 SSML 标签
- 如果必须本地部署且追求情感真实度,部署 GPT-SoVITS 并让 PHP 调用其 HTTP 接口
注意: 情感语音是一个非常主观的领域,API 厂商的效果通常优于大多数开源模型(尤其是在中文场景),建议先从云 API 开始。