MiniMax M2.7 编程实测 + TTS 语音 API 实战教程(2026)
MiniMax M2.7 主打两件事:工程编码和 Agent 工具调用。TTS 语音合成一直是 MiniMax 的传统强项——他们做 TTS 比做大语言模型早得多。这篇文章把两件事都实测一遍,Python 代码可以直接抄走用。
API 接入基础配置和模型参数详见 MiniMax M2.7 API 教程,本文专注编程能力评测和 TTS 实战。
Part 1:MiniMax M2.7 编程能力实测
环境准备
通过 ofox.ai 调用,改一行 base_url 就能跑起来:
from openai import OpenAI
client = OpenAI(
api_key="your-ofox-api-key", # 从 ofox.ai 获取
base_url="https://api.ofox.ai/v1"
)
MODEL = "minimax/minimax-m2.7"
# 对延迟敏感的场景用这个:
# MODEL = "minimax/minimax-m2.7-highspeed"
测试一:代码生成
用一个稍微有点实际复杂度的任务测——实现一个带重试和速率限制的 HTTP 请求封装:
prompt = """
写一个 Python 函数 `safe_request`,要求:
1. 对 requests.get 封装,支持自动重试(默认 3 次,指数退避)
2. 支持速率限制:每秒最多 N 次请求(默认 5)
3. 遇到 429/503 时自动等待重试,其他 4xx 直接抛异常
4. 带 typing 类型注解,函数签名要清晰
"""
response = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
temperature=0.2
)
print(response.choices[0].message.content)
M2.7 给出的代码是这样的(节选核心逻辑):
import time
import threading
from typing import Optional, Dict, Any
import requests
from requests import Response
class RateLimiter:
def __init__(self, max_calls: int, period: float = 1.0):
self.max_calls = max_calls
self.period = period
self.calls: list[float] = []
self.lock = threading.Lock()
def acquire(self) -> None:
with self.lock:
now = time.monotonic()
self.calls = [t for t in self.calls if now - t < self.period]
if len(self.calls) >= self.max_calls:
sleep_time = self.period - (now - self.calls[0])
time.sleep(max(0, sleep_time))
self.calls.append(time.monotonic())
_limiter = RateLimiter(max_calls=5)
def safe_request(
url: str,
params: Optional[Dict[str, Any]] = None,
headers: Optional[Dict[str, str]] = None,
max_retries: int = 3,
rate_limit: int = 5,
timeout: int = 30,
) -> Response:
global _limiter
if _limiter.max_calls != rate_limit:
_limiter = RateLimiter(max_calls=rate_limit)
for attempt in range(max_retries + 1):
_limiter.acquire()
try:
resp = requests.get(url, params=params, headers=headers, timeout=timeout)
if resp.status_code in (429, 503):
wait = 2 ** attempt
time.sleep(wait)
continue
resp.raise_for_status()
return resp
except requests.exceptions.HTTPError:
raise
except requests.exceptions.RequestException as e:
if attempt == max_retries:
raise
time.sleep(2 ** attempt)
raise RuntimeError(f"请求失败,已重试 {max_retries} 次")
代码质量合格——RateLimiter 用线程锁处理并发,重试逻辑清晰,类型注解完整。有个小问题:_limiter 用了全局变量,多实例场景会互相干扰。这个坑不是所有模型都能主动提示。
测试二:Debug 能力
给一段有 bug 的代码,让它找问题:
buggy_code = """
def calculate_average(numbers):
total = 0
for n in numbers:
total += n
return total / len(numbers)
# 测试
print(calculate_average([1, 2, 3])) # 正常
print(calculate_average([])) # 这里会出问题
print(calculate_average(["1", "2"])) # 这里也有问题
"""
response = client.chat.completions.create(
model=MODEL,
messages=[
{
"role": "user",
"content": f"这段代码有哪些 bug?怎么修?\n\n```python\n{buggy_code}\n```"
}
]
)
print(response.choices[0].message.content)
M2.7 准确识别了两个问题:空列表导致的 ZeroDivisionError,以及字符串传入时 += 的类型错误。修复方案是加 if not numbers: return 0.0 的 guard 和 isinstance 类型检查。没有多余废话,直接给修复代码——这是工程师想要的回答方式。
测试三:Stream 输出(适合长代码生成)
生成较长的代码文件时,用流式输出体验更好:
stream = client.chat.completions.create(
model="minimax/minimax-m2.7-highspeed", # 流式用 Highspeed 更顺畅
messages=[
{
"role": "user",
"content": "用 FastAPI 写一个完整的 CRUD API,实体是 Todo,用 SQLite + SQLAlchemy,包含 pytest 测试"
}
],
stream=True,
temperature=0.1,
max_tokens=8192
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)
Highspeed 模式下首 token 延迟明显更短,这在 IDE 集成场景里感知很明显。
和其他模型比什么水平
几个维度的主观评估(基于上面这类工程任务):
| 维度 | M2.7 | Claude Sonnet 4.6 | GPT-5.4 |
|---|---|---|---|
| 代码生成(中等复杂度) | ★★★★☆ | ★★★★★ | ★★★★★ |
| Bug 定位 | ★★★★☆ | ★★★★★ | ★★★★☆ |
| 中文注释质量 | ★★★★★ | ★★★★☆ | ★★★★☆ |
| 工具调用稳定性 | ★★★★☆ | ★★★★★ | ★★★★★ |
| 价格(输入/百万 token) | $0.30 | $3.00 | $2.50 |
结论:M2.7 在中等复杂度的工程编码任务上能打,价格是 Claude Sonnet 的十分之一。复杂的多文件重构、架构级别的设计建议,Claude/GPT 仍然更可靠。日常开发的辅助编程、批量代码生成,M2.7 的性价比很高。
详细的模型横评见这篇:MiniMax M2.5 vs Claude Sonnet 4.6 vs GPT-5.4 对比。
Part 2:MiniMax TTS 语音合成 API 实战
MiniMax 的 TTS 是他们最早做的事情之一,技术积累比 LLM 还深。语音质量在中文 TTS 里属于第一梯队,支持多种音色,延迟也控制得不错。
基础调用:文字转语音
MiniMax TTS 走 OpenAI 兼容的 /audio/speech 接口,已有 OpenAI SDK 的项目改两行参数就能跑:
from openai import OpenAI
from pathlib import Path
client = OpenAI(
api_key="your-ofox-api-key",
base_url="https://api.ofox.ai/v1"
)
def text_to_speech(text: str, output_path: str, voice: str = "Bowen_Mandarin") -> None:
"""
将文字转换为语音文件
Args:
text: 要合成的文字内容
output_path: 输出音频文件路径(.mp3 / .wav / .pcm)
voice: 音色名称
"""
response = client.audio.speech.create(
model="minimax/speech-02-hd", # 高质量版,也可用 speech-02-turbo
input=text,
voice=voice,
)
response.stream_to_file(output_path)
print(f"音频已保存到: {output_path}")
# 示例调用
text_to_speech(
text="欢迎使用 MiniMax 语音合成服务,这是一段测试文字。",
output_path="output.mp3"
)
可用模型和音色
| 模型 | 特点 | 适用场景 |
|---|---|---|
minimax/speech-02-hd | 高质量,延迟稍高 | 内容平台、有声书、产品播报 |
minimax/speech-02-turbo | 快速,轻微质量损失 | 实时交互、语音助手、客服 |
常用中文预设音色:
VOICES = {
"male_warm": "Bowen_Mandarin", # 男声,温和稳重
"male_news": "Tianyu_Mandarin", # 男声,新闻播报风格
"female_gentle": "Xiaoyi_Mandarin", # 女声,温柔自然
"female_bright": "Cove", # 女声,活泼清晰
}
流式 TTS(降低首包延迟)
对延迟敏感的场景(实时语音助手、直播),用流式接口:
import io
def stream_tts(text: str, voice: str = "Bowen_Mandarin") -> bytes:
"""流式接收 TTS 音频,适合实时播放场景"""
audio_buffer = io.BytesIO()
with client.audio.speech.with_streaming_response.create(
model="minimax/speech-02-turbo", # 流式场景用 turbo
input=text,
voice=voice,
response_format="mp3",
) as response:
for chunk in response.iter_bytes(chunk_size=4096):
audio_buffer.write(chunk)
# 实际场景中可以边写边播,这里简化为收集所有 chunk
return audio_buffer.getvalue()
# 配合 pygame 播放(示例)
audio_data = stream_tts("这段文字会被实时合成并播放。")
# play_audio(audio_data) # 接入你的播放器
批量文字转语音
批量处理文章段落、长文本:
from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path
import time
def batch_tts(
texts: list[str],
output_dir: str,
voice: str = "Bowen_Mandarin",
max_workers: int = 3, # 并发数别开太大,避免触发速率限制
) -> list[str]:
"""
批量转换文字列表为语音文件
Returns:
成功生成的文件路径列表
"""
Path(output_dir).mkdir(parents=True, exist_ok=True)
results = []
def convert_one(idx: int, text: str) -> tuple[int, str]:
output_path = f"{output_dir}/segment_{idx:04d}.mp3"
client.audio.speech.create(
model="minimax/speech-02-hd",
input=text,
voice=voice,
).stream_to_file(output_path)
return idx, output_path
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = {
executor.submit(convert_one, i, text): i
for i, text in enumerate(texts)
}
for future in as_completed(futures):
try:
idx, path = future.result()
results.append((idx, path))
print(f"[{idx+1}/{len(texts)}] 完成: {path}")
except Exception as e:
print(f"转换失败: {e}")
# 按原始顺序返回
results.sort(key=lambda x: x[0])
return [path for _, path in results]
# 示例:把文章段落批量转成音频
paragraphs = [
"第一段:MiniMax 是一家成立于 2021 年的中国 AI 公司。",
"第二段:他们最早专注于语音合成和对话 AI。",
"第三段:2026 年发布的 M2.7 是他们在大语言模型方向的最新进展。",
]
audio_files = batch_tts(paragraphs, output_dir="./audio_output")
print(f"生成了 {len(audio_files)} 个音频文件")
LLM + TTS 管道:读文章给你听
把 M2.7 的文字生成和 TTS 串起来,一个请求从主题到音频:
def generate_and_speak(topic: str, voice: str = "Bowen_Mandarin") -> str:
"""
先用 M2.7 生成内容,再用 TTS 转成语音
Args:
topic: 想生成的内容主题
voice: TTS 音色
Returns:
生成的音频文件路径
"""
# Step 1: LLM 生成内容
print(f"正在生成内容:{topic}")
llm_response = client.chat.completions.create(
model="minimax/minimax-m2.7",
messages=[
{
"role": "system",
"content": "你是一个专业的播音稿写作专家。写出来的内容要适合朗读:句子清晰、节奏自然、避免过多标点堆叠。"
},
{
"role": "user",
"content": f"请写一段关于「{topic}」的 100 字左右的播音稿。"
}
],
temperature=0.7,
max_tokens=300,
)
script = llm_response.choices[0].message.content
print(f"生成内容:\n{script}\n")
# Step 2: TTS 合成
output_path = f"tts_{topic[:10].replace(' ', '_')}.mp3"
print("正在合成语音...")
client.audio.speech.create(
model="minimax/speech-02-hd",
input=script,
voice=voice,
).stream_to_file(output_path)
print(f"音频已生成:{output_path}")
return output_path
# 示例
generate_and_speak("人工智能对软件开发的影响")
价格参考
MiniMax TTS 的计费按字符数,具体数字以官方为准。通过 ofox.ai 调用,人民币直接付款,不需要境外信用卡。相比 OpenAI TTS(按字符数计费),MiniMax TTS 在中文场景下价格有竞争力,且中文语音质量更自然。
多模态 API 的完整方案(Vision、TTS、Whisper 统一接入)见这篇:多模态 AI API 完全指南。
选型建议
M2.7 适合的场景:
- 编程辅助:成本敏感的团队,日常 code review、代码生成、文档补全
- Agent 后台任务:工具调用链、数据处理,不在乎每步延迟
- 中文 TTS 生产需求:有声内容、语音播报、客服语音
不适合的场景:
- 需要顶级推理准确率的关键业务(用 Claude Opus 4.6 或 GPT-5.4)
- 超长多轮对话(M2.7 最大输出 131K,但建议超过 50K 输出时做分段处理)
所有示例代码只需要把 base_url 换成 https://api.ofox.ai/v1,用微信宝支付,注册后即可调用。


