96SEO 2026-02-19 19:00 0
在开发中#xff0c;会遇到将文字转语音输出的需求#xff0…

CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客
大家好我是佛系工程师☆恬静的小魔龙☆不定时更新Unity开发技巧觉得有用记得一键三连哦。
在开发中会遇到将文字转语音输出的需求一般是通过在网上找免费的工具去实现。
这些有些差强人意配音的质量有点问题而且还容易崩溃就想着用Unity去实现一个文字转语音的工具。
本篇文章使用科大讯飞的SDK去实现文字转语音的功能会从如何申请科大讯飞的应用如何下载SDK如何配置环境如何搭建Unity程序一步一步实现最后也会将工程上传GitCode欢迎大家批评指正。
1打开讯飞开发平台https://www.xfyun.cn/登录注册一下
2注册完进入控制台https://console.xfyun.cn/app/myapp点击创建新应用
3平台选择Windows如果想要用手机搞可以选择Android然后AI能力选择离线语音合成普通版和在线语音合成流式版
这里的配置环境不是配置电脑上的环境而是配置Unity项目的环境需要将上一步下载的sdk导入到Unity中。
2将下载的文件解压缩找到msc.dll和msc_x64.dll
还有一个NAudio.dll是一个字节数组转AudioClip音频的动态链接库下载链接https://download.csdn.net/download/q764424567/88167687
1、封装MSCDLL类主调用函数登录、语音识别、语音合成都在这里面
System.Runtime.InteropServices;
UnityEngine.Windows.WebCam.VideoCapture;public
使用其他接口前必须先调用MSPLogin,可以在应用程序启动时调用///
每个参数和参数值通过keyvalue的形式组成参数对,如果有多个参数对,再用逗号进行拼接/param///
fo|[path]|[offset]|[length]|xx|xx
ivw_res_pathfo|res/ivw/wakeupresource.jet///
asr_res_pathfo|res/asr/common.jet;fo|res/asr/sms.jet///
成功返回MSP_SUCCESS,否则返回错误代码/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
确保其他接口调用结束之后调用MSPLogout,否则结果不可预期///
returns如果函数调用成功返回MSP_SUCCESS,否则返回错误代码
code./returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
command./returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
code./returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
exsit./returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
函数调用成功返回MSP_SUCCESS,否则返回错误代码/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
如果函数调用成功返回MSP_SUCCESS,否则返回错误代码/param///
成功返回缓冲区指针,失败或数据不存在返回NULL/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
离线语法识别结果门限值,设置只返回置信度得分大于此门限值的结果
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/param///
函数调用成功返回字符串格式的sessionID,失败返回NULL
sessionID是本次识别的句柄/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
由QISRSessionBegin返回的句柄/param///
识别器返回的状态,提醒用户及时开始\停止获取识别结果/param///
当写入首块音频时,将audioStatus置为MSP_AUDIO_SAMPLE_FIRST///
当写入最后一块音频时,将audioStatus置为MSP_AUDIO_SAMPLE_LAST///
其余情况下,将audioStatus置为MSP_AUDIO_SAMPLE_CONTINUE///
当epStatus显示已检测到后端点时,MSC已不再接收音频,应及时停止音频写入///
当rsltStatus显示有识别结果返回时,即可从MSC缓存中获取结果///
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
由QISRSessionBegin返回的句柄/param///
识别结果的状态,其取值范围和含义请参考QISRAudioWrite
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/param///
在音频写入完毕后,用户需反复调用此接口,直到识别结果获取完毕(rlstStatus值为5)或返回错误码
注意:如果某次成功调用后暂未获得识别结果,请将当前线程sleep一段时间,以防频繁调用浪费CPU资源///
其他情况(失败或无结果)返回NULL/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
本接口和QISRSessionBegin对应,调用此接口后,该句柄对应的相关资源(参数、语法、音频、实例等)都会被释放,用户不应再使用该句柄///
由QISRSessionBegin返回的句柄/param///
结束本次语音识别的原因描述,为用户自定义内容/param///
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
由QISRSessionbegin返回的句柄,如果为NULL,获取msc的设置信息/param///
函数调用成功返回MSP_SUCCESS,否则返回错误代码/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
合成文本编码格式,支持参数,GB2312,GBK,BIG5,UNICODE,GB18030,UTF8///
合成音频采样率,支持参数,16000,8000,默认为16000///
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/param///
函数调用成功返回字符串格式的sessionID,失败返回NULL
sessionID是本次合成的句柄/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
由QTTSSessionBegin返回的句柄/param///
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
由QTTSSessionBegin返回的句柄/param///
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/param///
在重复获取音频时,如果暂未获得音频数据,需要将当前线程sleep一段时间,以防频繁调用浪费CPU资源///
调用失败或无音频数据时,返回NULL/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
string./returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
本接口和QTTSSessionBegin对应,调用此接口后,该句柄对应的相关资源(参数
由QTTSSessionBegin返回的句柄/param///
结束本次语音合成的原因描述,为用户自定义内容/param///
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
errcode./returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
获取当前语音合成信息,如当前合成音频对应文本结束位置、上行流量、下行流量等///
由QTTSSessionBegin返回的句柄,如果为NULL,获取msc的设置信息/param///
函数调用成功则其值为MSP_SUCCESS,否则返回错误代码/returns[DllImport(msc_x64,
CallingConvention.StdCall)]public
[SDK]可能是应用没有权限访问某项服务,需要检查应用是否通过审核或参数是否合法、完整,检查相应文件是否具有读写权限
3.图像文字识别报错可能是参数不在要求的范围内或者图片格式不符合要求。
*
4.参数都看似正确的话,检查参数前是否有空格*/MSP_ERROR_INVALID_PARA_VALUE
某两个接口调用的时间间隔过长比如:调sessionbegin接口之后,过了很长时间才调了writeaudio接口*
2.评测业务:用户传送的文本长度大于规定字节中文限制在180字节,英文限制在300字节导致*
gb2312;开头,目前只支持这两种格式的abnf语法上传。
*
1.查看编码是否符合需求,一定要是utf-8编码,查看内部语法编写是否符合需求*
3.压缩音频或图片,不要超过上限可查阅文档确认上限*/MSP_ERROR_INVALID_DATA
已经调用MSPLogin接口,检查是否调用MSPLogout登出,如果是的话需要重新调用MSPLogin接口
可能与当前网络质量有关,可以换个网络再测试一下,查看网络环境是否正常,查看是否使用的网络对请求域名或者端口有限制
一般是合成出现该问题,查看是否每次合成字数超出上线,每次合成的字数太多或在线8192字节要限制在60s*
SDK仅支持:采样率16k或者8k,采样精度16bit,单声道pcm或者wav格式的音频
*/MSP_ERROR_CODING_LIB_NOT_LOAD
*/MSP_ERROR_MESSAGE_NOT_COMPLETE
10200(0x27D8)*/MSP_ERROR_NET_GENERAL
error*/MSP_ERROR_NFL_INNER_ERROR
10220,MSP_ERROR_NET_SSL_HANDSHAKE
10221,MSP_ERROR_NET_INVALID_ROOT_CERT
10222,MSP_ERROR_NET_INVALID_CLIENT_CERT
10223,MSP_ERROR_NET_INVALID_SERVER_CERT
10224,MSP_ERROR_NET_INVALID_KEY
10225,MSP_ERROR_NET_CERT_VERIFY_FAILED
*/MSP_ERROR_MSG_INVALID_CONTENT_TYPE
*/MSP_ERROR_MSG_INVALID_CONTENT_LENGTH
*/MSP_ERROR_MSG_INVALID_CONTENT_ENCODE
*/MSP_ERROR_MSG_SESSION_ID_EMPTY
*/MSP_ERROR_MSG_EXTERN_ID_EMPTY
*/MSP_ERROR_MSG_INVALID_SUBJECT
*/MSP_ERROR_MSG_INVALID_VERSION
*/MSP_ERROR_MSG_INVALID_SESSION_ID
*/MSP_ERROR_MSG_INVALID_CONTENT
10400(0x28A0)*/MSP_ERROR_DB_GENERAL
10500(0x2904)*/MSP_ERROR_RES_GENERAL
10600(0x2968)*/MSP_ERROR_TTS_GENERAL
*/MSP_ERROR_REC_NO_ACTIVE_GRAMMARS
*/MSP_ERROR_REC_DUPLICATE_GRAMMAR
*/MSP_ERROR_REC_INVALID_MEDIA_TYPE
*/MSP_ERROR_REC_INVALID_LANGUAGE
*/MSP_ERROR_REC_URI_FETCH_ERROR
*/MSP_ERROR_LOGIN_SESSIONID_INVALID
*/MSP_ERROR_LOGIN_SESSIONID_ERROR
11100,MSP_ERROR_HCR_RESOURCE_NOT_EXIST
11104,MSP_ERROR_HCR_APPEND_STROKES
11106,MSP_ERROR_HCR_POINT_DECODE
*/MSP_ERROR_AUTH_NO_ENOUGH_LICENSE
*/MSP_ERROR_AUTH_INVALID_LICENSE
*/MSP_ERROR_AUTH_LICENSE_EXPIRED
*/MSP_ERROR_AUTH_NEED_MORE_DATA
*/MSP_ERROR_AUTH_LICENSE_TO_BE_EXPIRED
*/MSP_ERROR_AUTH_INVALID_MACHINE_ID
*/MSP_ERROR_AUTH_LOCAL_ASR_FORBIDDEN
*/MSP_ERROR_AUTH_LOCAL_TTS_FORBIDDEN
*/MSP_ERROR_AUTH_LOCAL_IVW_FORBIDDEN
*/MSP_ERROR_AUTH_APPID_NOT_MATCH
11213MSP_ERROR_AUTH_LOCAL_IFD_FORBIDDEN
Authorization*/MSP_ERROR_AUTH_DVC_NO_LICENSE
11300,MSP_ERROR_AUTH_DVC_NO_ENOUGH_LICENSE
11301,MSP_ERROR_AUTH_DVC_INVALID_LICENSE
11302,MSP_ERROR_AUTH_DVC_LICENSE_EXPIRED
11303,MSP_ERROR_AUTH_DVC_NEED_MORE_DATA
11304,MSP_ERROR_AUTH_DVC_LICENSE_TO_BE_EXPIRED
11305,MSP_ERROR_AUTH_DVC_EXCEED_LICENSE
11402-11403MSP_ERROR_ASE_EXCEP_SNRATIO
11402,MSP_ERROR_ASE_EXCEP_PAPERDATA
*/MSP_ERROR_ASE_EXCEP_PAPERCONTENTS
11405-11406MSP_ERROR_ASE_EXCEP_NOTMONO
11405,MSP_ERROR_ASE_EXCEP_OTHERS
存在未登录词,比如:80-year-old中带有-,引擎会认为是减号*
*/MSP_ERROR_ASE_EXCEP_ULISTWORD
11500,MSP_ERROR_IOT_PARAM_ERROR
errorMSP_ERROR_IOT_INVALID_SERVICE
ProTranServerMSP_ERROR_IOT_INVALID_PRODUCTID
ProTranServerMSP_EEROR_IOT_INVALID_ATTR
ProTranServerMSP_ERROR_IOT_INVALID_PLATFORM
ProTranServerMSP_ERROR_IOT_DID_NOT_FOUND
注册有效次数rgn范围为2-9次,包括出错次数,最多不超过9次
*/MSP_ERROR_IVP_EXTRA_RGN_SOPPORT
因信号波形的幅度太大,而超出系统的线性范围,如记录尖叫声的音频*
更换注册或验证音频,声音太大,音量减小一点,或者说话远离手机一点
更换注册或验证音频,音量太小,音量增大一点,或者说话靠近手机一点
更换注册或验证音频,音频缺失开头和结尾,录音开始后再说话,录音完停顿一秒再结束,保证开头结尾有一定的静音
更换注册或验证音频,音频太短不足以提取有效音频特征,录音时候要接近正常语速,不要读太快
*/MSP_ERROR_IVP_UTTER_TOO_SHORT
更换音频或者修改密码文本,录音文本和录音不一致,可能是真的读错了,也可能能是读对了,但是发音不标准,有颤音,方言等,尽量读标准普通话,发音清晰
音频不够,注册自由说,而写入的音频又不够长时会报,告诉调用者继续传音频*
音频不够,注册自由说,而写入的音频又不够长时会报,告诉调用者继续传音频*
更换注册或验证音频,针对自由说,有效音频要超过20秒,录音时间一般不少于30秒
*/MSP_ERROR_IVP_NO_ENOUGH_AUDIO
11610MSP_ERROR_IVP_MODEL_NOT_FOUND_IN_HBASE
【人脸向左,对应的引擎错误码是20201】MSP_ERROR_FACE_IMAGE_FULL_RIGHT
【人脸向右,对应的引擎错误码是20202】MSP_ERROR_IMAGE_CLOCKWISE_WHIRL
【顺时针旋转,对应的引擎错误码是20203】MSP_ERROR_IMAGE_COUNTET_CLOCKWISE_WHIRL
【逆时针旋转,对应的引擎错误码是20204】MSP_ERROR_VALID_IMAGE_SIZE
,对应的引擎错误码是20205】MSP_ERROR_ILLUMINATION
【光照异常,对应的引擎错误码是20206】MSP_ERROR_FACE_OCCULTATION
【人脸被遮挡,对应的引擎错误码是20207】MSP_ERROR_FACE_INVALID_MODEL
【非法模型数据,对应的引擎错误码是20208】MSP_ERROR_FUSION_INVALID_INPUT_TYPE
【输入数据类型非法,对应的引擎错误码是20300】MSP_ERROR_FUSION_NO_ENOUGH_DATA
【输入的数据不完整,对应的引擎错误码是20301】MSP_ERROR_FUSION_ENOUGH_DATA
【输入的数据过多,对应的引擎错误码是20302】/*Error
AIUI*/MSP_ERROR_AIUI_CID_EXPIRED
*/MSP_ERROR_MMP_NETDSS_INITFAIL
*/MSP_ERROR_MMP_MAIL_SESSION_FAIL
邮件登陆服务器时,会话错误。
*/MSP_ERROR_MMP_MAIL_LOGON_FAIL
邮件登陆服务器时,拒绝登陆。
*/MSP_ERROR_MMP_MAIL_USER_ILLEGAL
邮件登陆服务器时,用户名非法。
*/MSP_ERROR_MMP_MAIL_PWD_ERR
邮件登陆服务器时,密码错误。
*/MSP_ERROR_MMP_MAIL_SOCKET_ERR
邮件发送过程中套接字错误*/MSP_ERROR_MMP_MAIL_INIT_FAIL
邮件初始化错误*/MSP_ERROR_MMP_STORE_MNR_NO_INIT
store_manager未初始化,或初始化失败*/MSP_ERROR_MMP_STORE_MNR_POOL_FULL
store_manager的连接池满了*/MSP_ERROR_MMP_STRATGY_PARAM_ILLEGAL
报警策略表达式非法*/MSP_ERROR_MMP_STRATGY_PARAM_TOOLOOG
报警策略表达式太长*/MSP_ERROR_MMP_PARAM_NULL
函数参数为空*/MSP_ERROR_MMP_ERR_MORE_TOTAL
总次数。
*/MSP_ERROR_MMP_PROC_THRESHOLD
进程监控阀值设置错误*/MSP_ERROR_MMP_SERVER_THRESHOLD
服务器监控阀值设置错误*/MSP_ERROR_MMP_PYTHON_NO_EXIST
*/MSP_ERROR_MMP_PYTHON_IMPORT_FAILED
*/MSP_ERROR_MMP_PYTHON_BAD_FUNC
*/MSP_ERROR_MMP_DB_DATA_ILLEGAL
*/MSP_ERROR_MMP_PMA_NOT_FOUND_STRATEGY
*/MSP_ERROR_MMP_PMC_SERVINFO_INVALID
*/MSP_ERROR_MMP_ALARM_GROUP_NULL
*/MSP_ERROR_MMP_ALARM_CONTXT_NULL
*/MSP_ERROR_LMOD_UNEXPECTED_BIN
*/MSP_ERROR_LMOD_RUNTIME_EXCEPTION
*/MSP_ERROR_LMOD_ALREADY_LOADED
exceptionMSP_ERROR_NGX_LOG_MORE_TOTEL_SIZE
checkingMSP_ERROR_FLASH_NETWORK_CONNECT_FIALED
/*flash服务端网络连接失败*/MSP_ERROR_FLASH_NETWORK_CHECK_FIALED
/*flash服务端响应了异常消息*/MSP_ERROR_FLASH_NETWORK_CHECK_TIMEOUT
/*flash服务端网络超时*/MSP_ERROR_FLASH_NETWORK_CLOSED_EXCEPTION
无有效的网络连接*/SPEECH_ERROR_NETWORK_TIMEOUT
网络连接超时*/SPEECH_ERROR_NET_EXPECTION
网络异常*/SPEECH_ERROR_INVALID_RESULT
未检测到语音*/SPEECH_ERROR_SPEECH_TIMEOUT
音频输入超时*/SPEECH_ERROR_EMPTY_UTTERANCE
无效的参数*/SPEECH_ERROR_TEXT_OVERFLOW
用户未登陆*/SPEECH_ERROR_PERMISSION_DENIED
*/SPEECH_ERROR_SYSTEM_PREINSTALL
*/SPEECH_ERROR_UNSATISFIED_LINK
*/SPEECH_ERROR_COMPONENT_NOT_INSTALLED
*/SPEECH_ERROR_ENGINE_NOT_SUPPORTED
*/SPEECH_ERROR_ENGINE_INIT_FAIL
*/SPEECH_ERROR_ENGINE_CALL_FAIL
/*客户端应用程序错误*///?????????SPEECH_ERROR_ASR_INVALID_PARA
/*无效的参数*/SPEECH_ERROR_ASR_INVALID_PARA_VALUE
/*无效的参数值*/SPEECH_ERROR_ASR_OUT_OF_MEMORY
/*内存耗尽*/SPEECH_ERROR_ASR_CREATE_HANDLE_FAILED
/*创建句柄失败*/SPEECH_ERROR_ASR_ENGINE_INIT_FAILED
/*引擎初始化失败*/SPEECH_ERROR_ASR_ENGINE_STARTED
/*引擎已经启动*/SPEECH_ERROR_ASR_ENGINE_UNINIT
/*引擎未初始化*/SPEECH_ERROR_ASR_SPEECH_TIMEOUT
/*识别超时VAD没开启或没有检测到后端点*/SPEECH_ERROR_ASR_NO_RECOGNIZED_RESULT
/*无识别结果*/SPEECH_ERROR_ASR_INVALID_HANDLE
/*无效的句柄*/SPEECH_ERROR_ASR_FILE_ACCESS
Engine*/SPEECH_ERROR_AITALK_FALSE
*/SPEECH_ERROR_AITALK_PERMISSION_DENIED
*/SPEECH_ERROR_AITALK_INVALID_PARA
3SPEECH_ERROR_AITALK_BUFFER_OVERFLOW
/*音频数据缓冲区已满*/SPEECH_ERROR_AITALK_FAILED
5SPEECH_ERROR_AITALK_NOT_SUPPORTED
/*引擎不支持*/SPEECH_ERROR_AITALK_OUT_OF_MEMORY
7SPEECH_ERROR_AITALK_INVALID_RESOURCE
/*资源无效*/SPEECH_ERROR_AITALK_NOT_FOUND
/*打开文件失败*/SPEECH_ERROR_AITALK_INVALID_GRAMMAR
*/SPEECH_ERROR_AITALK_INVALID_CALL
*/SPEECH_ERROR_AITALK_SYNTAX_ERROR
SPEECH_ERROR_AITALK_CANNOT_SAVE_FILE
*/SPEECH_ERROR_AITALK_INVALID_GRAMMAR_NAME
/*文法或词典名称非法*/SPEECH_ERROR_AITALK_BUFFER_EMPTY
18SPEECH_ERROR_AITALK_GET_RESULT
19SPEECH_ERROR_AITALK_REACT_OUT_TIME
/*反应超时*/SPEECH_ERROR_AITALK_SPEECH_OUT_TIME
/*语音超时*/SPEECH_ERROR_AITALK_AUDIO_CUT
/*录音质量过高*/SPEECH_ERROR_AITALK_AUDIO_LOWER
/*录音质量过低*/SPEECH_ERROR_AITALK_INSUFFICIENT_PERMISSIONS
/*授权不够*/SPEECH_ERROR_AITALK_RESULT_ERROR
/*解码器Wfst输出后,依然有cmd输出*/SPEECH_ERROR_AITALK_SHORT_PAUSE
27SPEECH_ERROR_AITALK_GRM_NOT_UPDATE
/*语法未更新*/SPEECH_ERROR_AITALK_STARTED
30SPEECH_ERROR_AITALK_ALREADY_STARTED
31SPEECH_ERROR_AITALK_ALREADY_STOPPED
32SPEECH_ERROR_AITALK_TOO_MANY_COMMAND
/*程序可能在做一些操作,主线程需要等待*/SPEECH_ERROR_AITALK_MAE_RIGHT
Operation*/SPEECH_ERROR_TTS_INVALID_PARA
*/SPEECH_ERROR_TTS_INVALID_PARA_VALUE
无效的参数值*/SPEECH_ERROR_TTS_OUT_OF_MEMORY
内存不足*/SPEECH_ERROR_TTS_INVALID_HANDLE
无效的句柄*/SPEECH_ERROR_TTS_CREATE_HANDLE_FAILED
创建句柄失败*/SPEECH_ERROR_TTS_INVALID_RESOURCE
*/SPEECH_ERROR_TTS_INVALID_VOICE_NAME
无效发言人*/SPEECH_ERROR_TTS_ENGINE_UNINIT
*/SPEECH_ERROR_TTS_ENGINE_INIT_FAILED
Engine*/SPEECH_ERROR_AISOUND_BASE
24100,SPEECH_ERROR_AISOUND_UNIMPEMENTED
*/SPEECH_ERROR_AISOUND_UNSUPPORTED
*/SPEECH_ERROR_AISOUND_INVALID_HANDLE
*/SPEECH_ERROR_AISOUND_INVALID_PARA
*/SPEECH_ERROR_AISOUND_INSUFFICIENT_HEAP
*/SPEECH_ERROR_AISOUND_STATE_REFUSE
*/SPEECH_ERROR_AISOUND_INVALID_PARA_ID
*/SPEECH_ERROR_AISOUND_INVALID_PARA_VALUE
*/SPEECH_ERROR_AISOUND_RESOURCE
*/SPEECH_ERROR_AISOUND_RESOURCE_READ
*/SPEECH_ERROR_AISOUND_LBENDIAN
*/SPEECH_ERROR_AISOUND_HEADFILE
*/SPEECH_ERROR_AISOUND_BUFFER_OVERFLOW
*/SPEECH_ERROR_AISOUND_INVALID_ISAMPA
alphabet*/SPEECH_ERROR_AISOUND_INVALID_CSSML
Operation*/SPEECH_ERROR_IVW_ENGINE_UNINI
*/SPEECH_ERROR_IVW_RESVER_NOMATCH
*/SPEECH_ERROR_IVW_BUFFERED_AUDIOD_LITTLE
*/SPEECH_ERROR_IVW_INVALID_RESTYPE
Engine*/SPEECH_ERROR_IVW_INVALID_CALL
3SPEECH_ERROR_IVW_OUT_OF_MEMORY
SPEECH_ERROR_IVW_OUT_BUFFER_FULL
5SPEECH_ERROR_IVW_OUT_BUFFER_EMPTY
SPEECH_ERROR_IVW_INVALID_RESOURCE
SPEECH_ERROR_IVW_REPETITIOPN_ENTER
SPEECH_ERROR_IVW_ENROLL1_SUCESS
SPEECH_ERROR_IVW_ENROLL1_FAILED
SPEECH_ERROR_IVW_ENROLL2_SUCESS
SPEECH_ERROR_IVW_ENROLL2_FAILED
SPEECH_ERROR_IVW_ENROLL3_SUCESS
SPEECH_ERROR_IVW_ENROLL3_FAILED
SPEECH_ERROR_IVW_SPEECH_TOO_SHORT
//第一块音频MSP_AUDIO_SAMPLE_CONTINUE
//已经检测到了音频前端点,正在进行正常的音频处理MSP_EP_AFTER_SPEECH
//检测到音频的后端点,后记的音频会被msc忽略MSP_EP_TIMEOUT
//识别成功,此时用户可以调用QISRGetResult来获取(部分结果)MSP_REC_STATUS_NO_MATCH
//识别结束,没有识别结果MSP_REC_STATUS_INCOMPLETE
正在识别中MSP_REC_STATUS_NON_SPEECH_DETECTED
3,MSP_REC_STATUS_SPEECH_DETECTED
//识别结束MSP_REC_STATUS_MAX_CPU_TIME
9,MSP_REC_STATUS_NO_SPEECH_FOUND
{XiaoYan,XuJiu,XiaoPing,XiaoJing,XuXiaoBao
}3、封装AudioClipExtension类字节转AudioClip工具类
System.Runtime.InteropServices;
self.channels];self.GetData(samples,
2];Buffer.BlockCopy(samples_int16,
self.channels];self.GetData(samples,
2];Buffer.BlockCopy(samples_int16,
Mp3FileReader(mp3stream);//转换wave格式的代码MemoryStream
MemoryStream(self);WaveFileReader
WaveFileReader(wavstream);WaveStream
WaveFormatConversionStream.CreatePcmStream(waveAudio);MemoryStream
byte[waveStream.Length];waveStream.Position
Convert.ToInt32(waveStream.Length));waveFileWriter.Write(bytes,
bytes.Length);waveFileWriter.Flush();}//
WAV(outputStream.ToArray());AudioClip
false);audioClip.SetData(wav.LeftChannel,
Marshal.AllocHGlobal(size);byte[]
retValue;try{Marshal.StructureToPtr(self,
byte[size];Marshal.Copy(intPtr,
array;}finally{Marshal.FreeHGlobal(intPtr);}return
Mp3FileReader(mp3stream);//转换wave格式的代码MemoryStream
MemoryStream(self);WaveFileReader
WaveFileReader(wavstream);WaveStream
WaveFormatConversionStream.CreatePcmStream(waveAudio);MemoryStream
byte[waveStream.Length];waveStream.Position
Convert.ToInt32(waveStream.Length));waveFileWriter.Write(bytes,
bytes.Length);waveFileWriter.Flush();}//
WAV(outputStream.ToArray());AudioClip
false);audioClip.SetData(wav.LeftChannel,
Marshal.AllocHGlobal(size);byte[]
retValue;try{Marshal.StructureToPtr(self,
byte[size];Marshal.Copy(intPtr,
array;}finally{Marshal.FreeHGlobal(intPtr);}return
System.Runtime.InteropServices;///
MSCDLL.QISRSessionBegin(null,subiat,domainiat,languagezh_cn,accentmandarin,sample_rate16000,result_typeplain,result_encoding
EpStatus.MSP_EP_LOOKING_FOR_SPEECH;/*
RecogStatus.MSP_REC_STATUS_SUCCESS;/*
MSCDLL.QISRAudioWrite(sessionID,
AudioStatus.MSP_AUDIO_SAMPLE_CONTINUE,
{res});MSCDLL.QISRSessionEnd(sessionID,
MSCDLL.QISRAudioWrite(sessionID,
AudioStatus.MSP_AUDIO_SAMPLE_LAST,
{res});MSCDLL.QISRSessionEnd(sessionID,
RecogStatus.MSP_REC_STATUS_COMPLETE){IntPtr
MSCDLL.QISRGetResult(sessionID,
{res});MSCDLL.QISRSessionEnd(sessionID,
4096);MSCDLL.QISRSessionEnd(sessionID,
sb.ToString();}sb.Append(Marshal.PtrToStringAnsi(curtRslt));}Thread.Sleep(150);}/*
MSCDLL.QISRSessionEnd(sessionID,
(string.IsNullOrEmpty(path)){Debug.Log(path
nameclip需要识别的AudioClip/param///
namecontent需要合成音频的文本内容/param///
aisbabyxu;break;default:break;}IntPtr
MSCDLL.QTTSSessionBegin($engine_type
(uint)Encoding.UTF8.GetByteCount(content),
SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA;Listbyte[]
(int)audioLength);bytesList.Add(byteArray);Thread.Sleep(150);if
SynthStatus.MSP_TTS_FLAG_DATA_END
e){OnErrorEvent();Debug.Log($error:
header.Convert2Bytes();bytesList.Insert(0,
MSCDLL.QTTSSessionEnd(sessionID,
namepath将合成后的音频写入指定的路径/param///
MSCDLL.QTTSSessionBegin(engine_type
(uint)Encoding.UTF8.GetByteCount(content),
SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA;/*
(int)audioLength);ms.Write(byteArray,
(int)audioLength);Thread.Sleep(150);if
SynthStatus.MSP_TTS_FLAG_DATA_END
e){OnErrorEvent();Debug.Log($error:
GetWaveHeader((int)ms.Length);byte[]
header.Convert2Bytes();ms.Position
FileAccess.Write);ms.WriteTo(fs);ms.Close();fs.Close();res
MSCDLL.QTTSSessionEnd(sessionID,
就随便搭建的不会搭建UI的可以下载我的源工程里面有搭建好的重要的代码。
2新建脚本命名为ExampleTTS.cs双击打开脚本编辑代码
Start(){//SpeakCoroutine(你好我是小燕);for
i;m_BtnPerson[i].onClick.AddListener(()
BtnPersonEvent(index));}m_Slide.OnEventTriggerEvent(EventTriggerType.PointerDown,
true;});m_Slide.OnEventTriggerEvent(EventTriggerType.PointerUp,
m_AudioSource.clip.length;m_AudioSource.Play();onDrag
false;});m_BtnPlay.onClick.AddListener(BtnPlayEvent);m_BtnSave.onClick.AddListener(BtnSaveEvent);voicetype
ToTimeFormat((float)m_AudioSource.time),
ToTimeFormat((float)m_AudioSource.clip.length));}if
m_AudioSource.clip.length);}}}///
恢复上一个按钮的状态m_BtnPerson[nextIndex].transform.Find(Select).gameObject.SetActive(false);m_BtnPerson[nextIndex].GetComponentInChildrenText().color
index;m_BtnPerson[nextIndex].transform.Find(Select).gameObject.SetActive(true);m_BtnPerson[nextIndex].GetComponentInChildrenText().color
TtsVoice.XuXiaoBao;break;default:break;}}///
未输入文本;return;}CreateVoice(voicetype,
未输入文本;return;}//使用时间戳作为文件名string
Path.Combine(Application.streamingAssetsPath,
action){StartCoroutine(TtsCoroutine(voice,
action){StartCoroutine(TtsCoroutine(path,
WaitForSeconds(0.1f);m_AudioSource.clip
isFinish);action?.Invoke();}IEnumerator
isFinsh);action?.Invoke();}//时长用0000显示public
}Slider的拖动事件用了EventTrigger事件监听所以需要新建脚本UIBehaviourExtension.cs编辑代码
UnityEngine.EventSystems;public
self.GetComponentEventTrigger()
self.gameObject.AddComponentEventTrigger();EventTrigger.Entry
};entry.callback.AddListener(action);eventTrigger.triggers.Add(entry);return
https://gitcode.net/q764424567/demo_tts
如果觉得本篇文章有用别忘了点个关注关注不迷路持续分享更多Unity干货文章。
专栏方向简介Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感总结从零开始学习Unity的路线有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析从UGUI的基础控件开始讲起然后将UGUI的原理UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR虚拟仿真开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法插件介绍等Unity3D之日常开发日常记录主要是博主日常开发中用到的用到的方法技巧开发思路代码分享等Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中遇到的BUG和坑让后来人可以有些参考。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback