base_service.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. """
  2. V2服务基类
  3. 提供所有V2服务的通用功能和工具方法
  4. """
  5. import logging
  6. import os
  7. from typing import Optional
  8. from sqlalchemy.orm import Session
  9. from app.services.oss_service import get_oss_service
  10. logger = logging.getLogger(__name__)
  11. class BaseV2Service:
  12. """V2服务基类"""
  13. def __init__(self, db: Session, user_id: str, api_key: str = None):
  14. """
  15. 初始化基础服务
  16. Args:
  17. db: 数据库会话
  18. user_id: 用户ID
  19. api_key: DashScope API密钥
  20. """
  21. self.db = db
  22. self.user_id = user_id
  23. self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY")
  24. self.oss_service = get_oss_service()
  25. # 设置DashScope API Key
  26. import dashscope
  27. dashscope.api_key = self.api_key
  28. def _generate_task_id(self) -> str:
  29. """
  30. 生成本地任务ID(UUID)
  31. Returns:
  32. UUID字符串
  33. """
  34. import uuid
  35. return str(uuid.uuid4())
  36. def _calculate_char_count(self, text: str) -> int:
  37. """
  38. 计算字符数(汉字算两个字符)
  39. Args:
  40. text: 待计算的文本
  41. Returns:
  42. 字符数(汉字算两个字符)
  43. """
  44. count = 0
  45. for char in text:
  46. # 判断是否为汉字(CJK统一汉字范围)
  47. if '\u4e00' <= char <= '\u9fff':
  48. count += 2
  49. else:
  50. count += 1
  51. return count
  52. def _estimate_duration_from_bytes(
  53. self,
  54. audio_data: bytes,
  55. format_str: str,
  56. sample_rate: int
  57. ) -> float:
  58. """
  59. 从音频字节数据估算时长
  60. Args:
  61. audio_data: 音频数据
  62. format_str: 音频格式
  63. sample_rate: 采样率
  64. Returns:
  65. 估算的时长(秒)
  66. """
  67. if format_str == "pcm":
  68. # PCM: 16bit mono = 2 bytes per sample
  69. return len(audio_data) / (sample_rate * 2)
  70. elif format_str == "wav":
  71. # WAV: 跳过44字节头,16bit mono
  72. return (len(audio_data) - 44) / (sample_rate * 2)
  73. elif format_str == "mp3":
  74. # MP3: 粗略估算,128kbps = 16KB/s
  75. return len(audio_data) / 16000
  76. else:
  77. # 默认估算
  78. return len(audio_data) / 16000