__load__.py 3.0 KB

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