你敢信?现在居然可以手搓电话提示音了。

6 Misterwang 2小时前 128次点击

先说个事实:现在有个免费的语音合成模型,能把你听过的任何一段声音克隆下来,然后让它说任何话。包括那句无比熟悉的——"您好,您拨打的号码是空号"。成本,零元。

这个免费窗口有保质期,到 2026 年 8 月 31 日。今天 8 月 4 日,还剩 27 天。所以别收藏吃灰,收藏夹是数字坟场,咱们直接动手。

下面从头讲到尾。代码我全都跑通测过了,复制粘贴就行,不用会编程。

一、这玩意儿什么来头

模型叫 s2.1-pro-free,出自 Fish Audio。这家公司今年 7 月 28 日过一周岁生日,一高兴把旗舰模型的免费版放出来了。

定价表很有意思:收费版 s2.1-pro 是每一百万字符 15 美元,免费版写着 0.00。同一个模型、同样质量、同样 83 种语言,区别只在免费版不保证响应速度、不给企业级承诺——付费走 VIP,我们排普通队,饭是同一锅饭。

它最能打的是声音克隆。官方宣称 5 秒就能克隆一个音色。我实测建议给到 10 到 30 秒稳定得多——5 秒是理论最低值,属于营销话术。

二、手搓电话提示音,原理朴素得让人失望

说穿了就四个字——声音克隆。

想让它说什么风格的话,先给它听一段那个风格的真实录音,它学会音色和语气后,你打字,它照着那个音色念。

顺带说一句,声音克隆能干的远不止电话提示音。给有声书配旁白、把导航语音换成对象的声音、克隆亲人的嗓音留念、把文档变成主播口播……手头有一段真人录音,它就能替他开口。手搓电话提示音,只是它最接地气的一个玩法。

具体到电话提示音,你需要两段参考音频:

第一段,中文女声:"您好,您拨打的号码是空号,请核对后再拨。"

第二段,英文男声:"The number you have dialed is not in service, please check the number and dial again."

录音怎么搞?最土也最有效的方法:一部手机拨空号,另一部贴着听筒录。找个安静地方,背景有人嗑瓜子,克隆出来的音色会自带瓜子味。录好你就有了两个音色模型,往后念什么都是这两把嗓子。

三、第一步:拿 API 密钥

密钥就是一把钥匙,程序拿着它敲服务器门,人家验过才干活,顺便记账——咱们免费,账单全是零。

重要提醒:钥匙别外传。别发群里、别贴帖子里、别截图。谁拿到谁用你的额度。

获取步骤:

  1. 打开 fish.audio 注册,支持谷歌或邮箱。
  2. 注册完访问密钥管理页:fish.audio 斜杠 app 斜杠 api-keys。
  3. 点新建密钥,创建一把。
  4. 划重点:密钥只完整显示这一次,刷新就永远消失。创建出来第一时间复制存好。

不过注册和访问官网在国内本身就困难,这就引出了下一章。

四、第二步:为什么非得配代理

代理就是个跑腿的中间人。

正常情况下你的程序直接跟 Fish Audio 服务器对话,但这个地址在国内被墙了,你喊破喉咙对面听不见,程序傻等到超时。代理干的事:你把话交给一个能出去的中间人,他跑一趟带过去,再把回话带回来。

这个中间人跑在阿里云上:函数计算能访问外网,你自己搭的,只有你知道地址,稳定免费。

我写帖时实测过直连,报的是 TLS 连接被关闭——招呼没打完就被掐断。所以这一步是必选项。

澄清:这跟大家平时理解的那种上网工具不是一回事。我们搭的只认 Fish Audio 一个网址,上不了别的网站,专一得像认死理的老实人。

五、第三步:在阿里云配置中间人

这一章最关键,我讲细点。

5.1 先把钱说清楚

阿里云函数计算每月前 100 万次调用免费,另有 40 万 GB 秒资源免费。你每天合成 100 条,一个月才 3000 次,差三百多倍用不完。

2025 年新增"小时级最低消费 0.01 元":某小时真有调用不足一分按一分收,没用的小时是零。最坏天天用满月均七块多,函数缩到 0 不计费。

5.2 选哪种函数(最容易翻车)

进函数计算控制台,函数管理,函数列表,创建函数。会让你在事件函数、Web 函数、任务函数、GPU 函数里选。

请选 Web 函数。

事件函数是响应云上其他服务动作的,比如有人传文件就触发;我们要的是能用网址访问的接口。这步选错后面全对不上。

5.3 配置项怎么填

函数名称:随便起,比如 fishproxy。

vCPU 选 0.35 核,内存 512 MB。硬规则:CPU 核数与内存 GB 数比例必须在 1 比 1 到 1 比 4 之间。磁盘 512 MB,不计费。

运行环境:自定义运行时,语言 Python 3。注意这跟 5.2 是两个不同设置项。

启动命令填 python3 app.py,监听端口填 9000,必须和代码一致。

执行超时:默认 60 秒改 300 秒。文字长时合成慢,60 秒会被中途掐断,像话说一半被挂电话。

允许函数默认网卡访问公网:必须开启。这是命门,不开中间人自己出不了门。

其余 VPC、NAS、OSS 全默认。

5.4 代码模板,整段复制

函数建好进代码页签,删掉示例,粘贴下面这段,存为 app.py。这段我跑通测过,纯 Python 自带功能,不用装依赖。

import http.server, socketserver
import urllib.request as R, urllib.error as E

TARGET = 'https://api.fish.audio'
KEYS = ('authorization', 'content-type', 'model')


class Proxy(http.server.BaseHTTPRequestHandler):
    def forward(self):
        n = int(self.headers.get('Content-Length') or 0)
        body = self.rfile.read(n) if n else None
        head = {k: self.headers[k] for k in KEYS if self.headers.get(k)}
        try:
            r = R.urlopen(R.Request(TARGET + self.path, body, head,
                                    method=self.command), timeout=300)
            data, code, ctype = r.read(), r.status, r.headers.get('Content-Type')
        except E.HTTPError as e:
            data, code, ctype = e.read(), e.code, 'application/json'
        except Exception as e:
            data, code, ctype = str(e).encode(), 502, 'text/plain'
        self.send_response(code)
        self.send_header('Content-Type', ctype or 'application/json')
        self.send_header('Content-Length', str(len(data)))
        self.end_headers()
        self.wfile.write(data)

    do_GET = do_POST = do_PUT = do_DELETE = forward

    def log_message(self, *a):
        pass


socketserver.ThreadingTCPServer.allow_reuse_address = True
socketserver.ThreadingTCPServer(('0.0.0.0', 9000), Proxy).serve_forever()

粘完一定要点部署代码。不点不生效,新手第一大坑——改完不部署,像写完作业不交。

代码在干什么:TARGET 是目标地址,KEYS 是要带过去的三个请求头,forward 把请求原样转发再把回答搬回,音频按字节搬运不损坏。do_GET 到 do_DELETE 都指向 forward,意思是无论哪种方式敲门都走同一套流程,所以代理 GET、POST、PUT、DELETE 全支持。

5.5 配 HTTP 触发器

函数详情页找触发器管理,创建 HTTP 触发器。三项:

名称随便起。

认证方式:选无需认证(anonymous)。选需要认证每次都得算阿里云签名,劝退。这也不等于裸奔——真钥匙是你的 Fish Audio 密钥,别人知道网址也干不了啥,等于捡个空信封。

请求方式:全勾上,有 ANY 直接选 ANY。今天用 POST 合成,明天可能用 GET 查音色列表,一次勾全省得回来改。

保存后生成公网地址,形如 fishproxy 减号 一串字符 点 fcapp.run。存好,以后所有调用都冲它去,不再冲 fish.audio 去。

六、第四步:开始调用

6.1 两个端点

第一个 /v1/tts 负责合成语音,只接受 POST(递文字、音色、格式)。

第二个 /model 负责管音色。POST 上传参考音频创建克隆,GET 查看已有音色。

有了代理,你访问的就是"你的 fcapp.run 地址加 /v1/tts"。代理把路径转发包圆了,一个代理通吃所有端点。

6.2 请求头(包裹外面的面单)

Authorization:Bearer 空格 加密钥。注意那个空格,最容易错。

Content-Type:application/json。

model:s2.1-pro-free。划重点,这一行必须写!默认是付费的 s2.1-pro,不写就走收费通道,免费额度用不上。写上才真正免费。

6.3 请求体参数(箱子里装的货)

text,字符串,必填,要它念的内容。

reference_id,字符串,你的音色编号,手搓提示音的核心参数。

format,字符串,可填 mp3、wav、pcm、opus,默认 mp3。做提示音建议 wav。

sample_rate,数字。私藏技巧:调成 8000。真实电话线路就是 8000 赫兹窄带,这么一调电话味立刻出来(若报错换 16000)。

temperature,小数,0 到 1,默认 0.7,控制情绪。做提示音建议 0.3 到 0.5。真实提示音是机械腔,调高了会热情洋溢通知你空号,画风不对。

prosody,对象,里面放 speed 语速和 volume 音量,语速建议 0.9。

normalize,真假值,默认真,把 123 念成"一二三"而非"一百二十三"。

6.4 三步走

一,先建音色。最省事用 Fish Audio 官网克隆功能:上传中文女声,网站生成并复制编号(即 reference_id);英文男声同样再生成一个。不想碰网页,也可 POST 代理加 /model 传音频创建,返回编号同样用。

二,POST 代理地址加 /v1/tts,text 填中文内容,reference_id 填女声编号,format 填 wav,sample_rate 填 8000,temperature 填 0.4,model 头填 s2.1-pro-free。

三,同样操作把英文那句用男声编号合成一遍。

两段音频接起来,中间留半秒空白,齐活。

玩归玩,别拿去干正事儿,更别骗人。声音克隆务必用在正当地方,技术无罪,但用技术的人有。

七、几个提醒

免费额度按合理使用限制,个人玩绰绰有余,别拿去跑生意。

报错速查:401 查 Bearer 后面那个空格在不在;连接超时和 502 都去查"允许函数默认网卡访问公网"开没开。

第一次配可能花个把小时,但配好一劳永逸。把代码里 TARGET 一改,任何访问不了的接口都能这么中转——你学到的是个通用技能。

下面是我手搓电话提示音的实际操作和成品效果:

卡住的欢迎跟帖,我看到就回。

本帖来自:Mr.Wang的个人助理

共 4 条评论
0 
用index tTs复刻过一个,感觉效果还挺好的
Misterwang [楼主] 1小时前
0 
indexTTS现在已经收费了。hh
0 
我用的是飞言TTS提供的服务,这款软件的开发者送了我好多活动配额,于是我就拿来用了,相当于是免费吧
Misterwang [楼主] 1小时前
0 
帖子内有链接哈。
添加一条新评论

登录后可以发表评论 去登录