请在开始前务必阅读以下内容:
- 在联系我们之前,请先在文档中检查是否有相似的问题可以参考。
- 如果
task-failed
时存在错误代码,请先参考官方文档中的错误码说明:错误码说明。 - 联系我们时您最好可以提供以下信息:
RequestId
和TaskId
- 发送的文本内容
- 如有可能,请提供 SDK 侧打印的日志信息
你可以通过以下步骤开启日志功能:
在命令行设置环境变量:
export DASHSCOPE_LOGGING_LEVEL=debug
- 通过pom配置@Slf4j日志依赖:
<!-- Lombok for @Slf4j -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<!-- Logback Implementation -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.6</version>
</dependency>
- 在resources目录下添加
logback.xml
:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>
- 解析回调函数中的json获得request_id/task_id
- 在调用完streamingCall/call/streamingComplete之后调用get_last_request_id/getLastRequestId方法获取。请注意,如果使用Java Flowable的话无法通过getLastRequestId获取。
解答:
- 请检查保存文件的后缀是否正确,默认格式为mp3。
- 请检查是否是在on_data/onEvent回调中打开文件并保存。由于音频是按照音频流从回调中返回,因此此种方法只会保存一个音频chunk,并且在每次写入覆盖文件。正确的保存方法为在callback外部打开文件,在回调用追加写入。参考示例代码Java示例和Python示例
解答:
- 检查SDK设置的音频格式、采样率和播放器是否一致。
- 如果保存的音频可以正常播放,则请检查是否将每个音频包都当做完整的音频文件播放。在流式播放中,是将一个完整的wav文件的音频按照8000字节一段分割为多个chunk返回。而在播放流式音频时,需要使用支持流式播放的音频播放器,比如pyaudio、ffmpeg、audio标签、AudioContext等,而不是将每一个chunk当作一个独立的音频播放,这样无法成功解码。
解答:
- 首先请参考Java示例和Python示例保存收到的音频,排查是播放器卡顿还是下发音频卡顿。如果保存音频卡顿,则请请将RequestId/TaskId提供给我们排查。
- 请检查是否发送文本过慢,已发送文本已经读完。
- 请检查回调函数中(特别是on_data/onEvent)是否有过多业务代码阻塞。由于回调在websocket线程中,因此回阻塞websocket接收网络包,导致接收音频卡住。可以自己写一个audio buffer,在回调用将音频写入buffer,在其他线程中读取并处理。
- 请检查网络是否不稳定。
- 如果非上述原因造成,请将RequestId/TaskId提供给我们排查。
解答: 请检查是否调用了streamingComplete方法,否则服务端存在未合成的文本缓存。
解答: 请检查本地播放器是否存在缓存音频需要清空。
Python SDK报错:
websocket closed due to [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)
解答: 连接websocket时,本地的openssl验证证书失败,找不到证书。通常是python环境配置错误。
#命令1
security find-certificate -a -p > ~/all_mac_certs.pem; export SSL_CERT_FILE=~/all_mac_certs.pem; export REQUESTS_CA_BUNDLE=~/all_mac_certs.pem
#命令2
ln -s /etc/ssl/* /Library/Frameworks/Python.framework/Versions/3.9/etc/openssl
执行上面这两条命令手动定位证书。第2条命令注意选择您本地环境python版本的对应目录。
Java报错:
Parameter invalid: StreamInputTtsParam is null
Parameter invalid: ResultCallback is null
Python报错:
Model is required!
format is required!
callback is required!
解答: 缺少对应必填字段,请参照API详情文档填写。
Python报错:speech synthesizer has not been started.
Java报错:State invalid: expect stream input tts state is started but idle
解答:
- 如果是在调用streamingComplete/streamingCancel时出现,请检查是否之前调用过streamingCall开始任务。
- 请检查是否在调用streamingComplete之后再次调用streamingCall。同一个synthesizer对象不可复用。
- 请检查回调函数中是否有task-failed出现,如果是使用call接口可以开启日志查看收到的消息。如果收到task-failed则根据错误提示进一步排查。
- 检查on_close是否被调用,出现网络中断导致webscoket连接中断。
发送文本不可为空。
解答: 请检查是否在调用streamingComplete之后再次调用streamingCall。同一个synthesizer对象不可复用。
Python报错:speech synthesizer wait for complete timeout 10000ms
解答: 请将requestId/taskId发送给我们排查。
解答: 超过23秒没有发送文本并且没有音频下发,则服务会中断websocket连接。服务不会无限保持连接,请在适当时候调用streamingComplete结束连接。
解答: 发送文本不可为空。
1、请检查当前音色不支持。请确认是否音色在音色列表中。 2、其他情况请将requestId/taskId发送给我们排查。