__load__.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. # -*- coding: utf-8 -*-
  2. import sys
  3. reload(sys)
  4. sys.setdefaultencoding('utf8')
  5. from demeter.core import *
  6. from datetime import *
  7. import time
  8. import uuid
  9. import os
  10. import os.path
  11. import wave
  12. import tempfile
  13. import cProfile
  14. import base64
  15. from pydub import AudioSegment
  16. from uuid import getnode as get_mac
  17. from abc import ABCMeta, abstractmethod
  18. from ctypes import CFUNCTYPE, c_char_p, c_int, cdll
  19. from contextlib import contextmanager
  20. def py_error_handler(filename, line, function, err, fmt):
  21. pass
  22. ERROR_HANDLER_FUNC = CFUNCTYPE(None, c_char_p, c_int, c_char_p, c_int, c_char_p)
  23. c_error_handler = ERROR_HANDLER_FUNC(py_error_handler)
  24. @contextmanager
  25. def no_alsa_error():
  26. try:
  27. asound = cdll.LoadLibrary('libasound.so')
  28. asound.snd_lib_error_set_handler(c_error_handler)
  29. yield
  30. asound.snd_lib_error_set_handler(None)
  31. except:
  32. yield
  33. pass
  34. def getPlayerByFileName(fname):
  35. foo, ext = os.path.splitext(fname)
  36. if ext == '.mp3':
  37. return Demeter.service('sox', 'player')
  38. elif ext == '.wav':
  39. return Demeter.service('wav', 'player')
  40. """
  41. 将 mp3 文件转成 wav
  42. :param file: mp3 文件路径
  43. :return: wav 文件路径
  44. """
  45. def convertMp3ToWav(file):
  46. target = file.replace(".mp3", ".wav")
  47. if not os.path.exists(file):
  48. Demeter.logger.critical("文件错误 {}".format(file))
  49. return None
  50. AudioSegment.from_mp3(file).export(target, format="wav")
  51. return target
  52. """
  53. 将 wav 文件转成 mp3
  54. :param file: wav 文件路径
  55. :return: mp3 文件路径
  56. """
  57. def convertWavToMp3(file):
  58. target = file.replace('.wav', '.mp3')
  59. if not os.path.exists(file):
  60. Demeter.logger.critical("文件错误 {}".format(file))
  61. return None
  62. AudioSegment.from_wav(file).export(target, format="mp3")
  63. return target
  64. """
  65. 从 wav 文件中读取 pcm
  66. :param file: wav 文件路径
  67. :return: pcm 数据
  68. """
  69. def getPcmFromWav(file):
  70. wav = wave.open(file, 'rb')
  71. return wav.readframes(wav.getnframes())
  72. """
  73. 二进制形式写入临时文件
  74. :param data: 二进制数据
  75. :param suffix: 后缀名
  76. :return: 文件保存后的路径
  77. """
  78. def writeTempFile(data, suffix):
  79. with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as f:
  80. f.write(data)
  81. tmpfile = f.name
  82. return tmpfile
  83. # 清理目录
  84. def clean():
  85. temp = Demeter.config['vecan']['temp']
  86. temp_files = os.listdir(temp)
  87. for f in temp_files:
  88. if os.path.isfile(os.path.join(temp, f)) and re.match(r''+Demeter.config['vecan']['outname']+'[\d]*\.wav', os.path.basename(f)):
  89. os.remove(os.path.join(temp, f))
  90. """ 获取缓存的语音 """
  91. def getCache(msg):
  92. md5 = Demeter.md5(msg)
  93. mp3_cache = os.path.join(Demeter.config['vecan']['temp'], md5 + '.mp3')
  94. wav_cache = os.path.join(Demeter.config['vecan']['temp'], md5 + '.wav')
  95. if os.path.exists(mp3_cache):
  96. return mp3_cache
  97. elif os.path.exists(wav_cache):
  98. return wav_cache
  99. return None
  100. """ 获取缓存的语音 """
  101. def saveCache(voice, msg):
  102. foo, ext = os.path.splitext(voice)
  103. md5 = Demeter.md5(msg)
  104. shutil.copyfile(voice, os.path.join(Demeter.config['vecan']['temp'], md5+ext))