四零语境后端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

242 lines
5.9 KiB

15 hours ago
  1. /**
  2. * UniApp TTS接口配置文件
  3. * 用于配置文字转语音相关的API接口和参数
  4. */
  5. // API配置
  6. export const API_CONFIG = {
  7. // 开发环境API地址
  8. DEV_BASE_URL: 'http://localhost:8080',
  9. // 生产环境API地址(请根据实际情况修改)
  10. PROD_BASE_URL: 'https://your-domain.com',
  11. // 接口路径
  12. ENDPOINTS: {
  13. // 获取音色列表
  14. VOICE_LIST: '/appletApi/tts/list',
  15. // 文字转语音
  16. TEXT_TO_VOICE: '/appletApi/tts/textToVoice'
  17. },
  18. // 请求超时时间(毫秒)
  19. TIMEOUT: 30000
  20. };
  21. // TTS参数配置
  22. export const TTS_CONFIG = {
  23. // 语速配置
  24. SPEED: {
  25. MIN: -2,
  26. MAX: 6,
  27. DEFAULT: 0,
  28. OPTIONS: [
  29. { value: -2, label: '0.6倍速', description: '很慢' },
  30. { value: -1, label: '0.8倍速', description: '慢' },
  31. { value: 0, label: '1.0倍速', description: '正常' },
  32. { value: 1, label: '1.2倍速', description: '快' },
  33. { value: 2, label: '1.5倍速', description: '很快' },
  34. { value: 6, label: '2.5倍速', description: '极快' }
  35. ]
  36. },
  37. // 音量配置
  38. VOLUME: {
  39. MIN: -10,
  40. MAX: 10,
  41. DEFAULT: 0
  42. },
  43. // 音频格式配置
  44. CODEC: {
  45. OPTIONS: [
  46. { value: 'wav', label: 'WAV', description: '无损音质,文件较大' },
  47. { value: 'mp3', label: 'MP3', description: '压缩音质,文件适中' },
  48. { value: 'pcm', label: 'PCM', description: '原始音频,文件最大' }
  49. ],
  50. DEFAULT: 'wav'
  51. },
  52. // 文本限制
  53. TEXT: {
  54. MAX_LENGTH: 500,
  55. MIN_LENGTH: 1
  56. }
  57. };
  58. // 错误码配置
  59. export const ERROR_CODES = {
  60. // 网络错误
  61. NETWORK_ERROR: 'NETWORK_ERROR',
  62. // 参数错误
  63. PARAM_ERROR: 'PARAM_ERROR',
  64. // 服务器错误
  65. SERVER_ERROR: 'SERVER_ERROR',
  66. // 音频播放错误
  67. AUDIO_ERROR: 'AUDIO_ERROR',
  68. // 文件操作错误
  69. FILE_ERROR: 'FILE_ERROR'
  70. };
  71. // 错误消息配置
  72. export const ERROR_MESSAGES = {
  73. [ERROR_CODES.NETWORK_ERROR]: '网络连接失败,请检查网络设置',
  74. [ERROR_CODES.PARAM_ERROR]: '参数错误,请检查输入内容',
  75. [ERROR_CODES.SERVER_ERROR]: '服务器错误,请稍后重试',
  76. [ERROR_CODES.AUDIO_ERROR]: '音频播放失败,请重试',
  77. [ERROR_CODES.FILE_ERROR]: '文件操作失败,请重试'
  78. };
  79. // 工具函数
  80. export const UTILS = {
  81. /**
  82. * 获取当前环境的API基础地址
  83. */
  84. getBaseUrl() {
  85. // #ifdef MP-WEIXIN
  86. // 微信小程序环境
  87. return process.env.NODE_ENV === 'production' ? API_CONFIG.PROD_BASE_URL : API_CONFIG.DEV_BASE_URL;
  88. // #endif
  89. // #ifdef H5
  90. // H5环境
  91. return process.env.NODE_ENV === 'production' ? API_CONFIG.PROD_BASE_URL : API_CONFIG.DEV_BASE_URL;
  92. // #endif
  93. // #ifdef APP-PLUS
  94. // App环境
  95. return API_CONFIG.PROD_BASE_URL;
  96. // #endif
  97. return API_CONFIG.DEV_BASE_URL;
  98. },
  99. /**
  100. * 构建完整的API地址
  101. * @param {string} endpoint 接口路径
  102. */
  103. buildApiUrl(endpoint) {
  104. return this.getBaseUrl() + endpoint;
  105. },
  106. /**
  107. * 格式化文件大小
  108. * @param {number} bytes 字节数
  109. */
  110. formatFileSize(bytes) {
  111. if (bytes === 0) return '0 B';
  112. const k = 1024;
  113. const sizes = ['B', 'KB', 'MB', 'GB'];
  114. const i = Math.floor(Math.log(bytes) / Math.log(k));
  115. return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
  116. },
  117. /**
  118. * 验证文本长度
  119. * @param {string} text 文本内容
  120. */
  121. validateText(text) {
  122. if (!text || typeof text !== 'string') {
  123. return { valid: false, message: '请输入文本内容' };
  124. }
  125. const trimmedText = text.trim();
  126. if (trimmedText.length < TTS_CONFIG.TEXT.MIN_LENGTH) {
  127. return { valid: false, message: '文本内容不能为空' };
  128. }
  129. if (trimmedText.length > TTS_CONFIG.TEXT.MAX_LENGTH) {
  130. return { valid: false, message: `文本长度不能超过${TTS_CONFIG.TEXT.MAX_LENGTH}个字符` };
  131. }
  132. return { valid: true, text: trimmedText };
  133. },
  134. /**
  135. * 验证语速参数
  136. * @param {number} speed 语速值
  137. */
  138. validateSpeed(speed) {
  139. if (typeof speed !== 'number') {
  140. return { valid: false, message: '语速参数必须为数字' };
  141. }
  142. if (speed < TTS_CONFIG.SPEED.MIN || speed > TTS_CONFIG.SPEED.MAX) {
  143. return { valid: false, message: `语速范围为${TTS_CONFIG.SPEED.MIN}${TTS_CONFIG.SPEED.MAX}` };
  144. }
  145. return { valid: true, speed };
  146. },
  147. /**
  148. * 验证音量参数
  149. * @param {number} volume 音量值
  150. */
  151. validateVolume(volume) {
  152. if (typeof volume !== 'number') {
  153. return { valid: false, message: '音量参数必须为数字' };
  154. }
  155. if (volume < TTS_CONFIG.VOLUME.MIN || volume > TTS_CONFIG.VOLUME.MAX) {
  156. return { valid: false, message: `音量范围为${TTS_CONFIG.VOLUME.MIN}${TTS_CONFIG.VOLUME.MAX}` };
  157. }
  158. return { valid: true, volume };
  159. },
  160. /**
  161. * 获取语速描述
  162. * @param {number} speed 语速值
  163. */
  164. getSpeedDescription(speed) {
  165. const option = TTS_CONFIG.SPEED.OPTIONS.find(item => item.value === speed);
  166. return option ? option.description : '未知';
  167. },
  168. /**
  169. * 获取音频格式描述
  170. * @param {string} codec 音频格式
  171. */
  172. getCodecDescription(codec) {
  173. const option = TTS_CONFIG.CODEC.OPTIONS.find(item => item.value === codec);
  174. return option ? option.description : '未知格式';
  175. },
  176. /**
  177. * 生成唯一ID
  178. */
  179. generateId() {
  180. return 'id_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
  181. },
  182. /**
  183. * 获取当前时间戳
  184. */
  185. getCurrentTimestamp() {
  186. return Date.now();
  187. },
  188. /**
  189. * 格式化时间
  190. * @param {number} timestamp 时间戳
  191. */
  192. formatTime(timestamp) {
  193. const date = new Date(timestamp);
  194. return date.toLocaleString('zh-CN', {
  195. year: 'numeric',
  196. month: '2-digit',
  197. day: '2-digit',
  198. hour: '2-digit',
  199. minute: '2-digit',
  200. second: '2-digit'
  201. });
  202. }
  203. };
  204. // 默认导出配置对象
  205. export default {
  206. API_CONFIG,
  207. TTS_CONFIG,
  208. ERROR_CODES,
  209. ERROR_MESSAGES,
  210. UTILS
  211. };