This Tinyscript-based tool, based on PyDub, allows to append audio files, filter the result as voice frequency and alter the playback speed.
This can be installed using:
$ pip install tinyscript
$ tsm install audio-assembler
This Tinyscript-based tool, based on PyDub, allows to append audio files, filter the result as voice frequency and alter the playback speed.
This can be installed using:
$ pip install tinyscript
$ tsm install audio-assembler
| #!/usr/bin/env python | |
| # -*- coding: UTF-8 -*- | |
| from pydub import AudioSegment | |
| from pydub.playback import play | |
| from tinyscript import * | |
| __author__ = "Alexandre D'Hondt" | |
| __version__ = "3.0" | |
| __copyright__ = "A. D'Hondt" | |
| __license__ = "agpl-3.0" | |
| __doc__ = """ | |
| This simple tool, based on PyDub, allows to append audio files, filter the | |
| result as voice frequency and alter the playback speed. | |
| """ | |
| __examples__ = ["audio_dir -s 10 --voice"] | |
| class Song(object): | |
| def __init__(self, *song_files): | |
| self.__song = None | |
| self.append(*song_files) | |
| def append(self, *song_files): | |
| """ This appends song files to the current song. """ | |
| songs = [] if self.__song is None else [self.__song] | |
| for f in song_files: | |
| from_method = "from_{}".format(Path(f).suffix[1:]) | |
| filename = Path(f).filename | |
| m = getattr(AudioSegment, from_method, "from_file") | |
| try: | |
| logger.debug("Trying to append '{}'...".format(filename)) | |
| songs.append(m(str(f))) | |
| logger.info("Appended: {}".format(filename)) | |
| except: | |
| logger.debug("An error occured while trying to append {}" | |
| " (AudioSegment.{})".format(filename, from_method)) | |
| logger.warning("Skipped: {}".format(filename)) | |
| if len(songs) > 0: | |
| self.__song = sum(songs) | |
| def export(self, filename): | |
| """ This exports the current song to a target file. """ | |
| if self.__song is None: | |
| return | |
| fmt = Path(filename).suffix[1:] | |
| try: | |
| self.__song.export(filename, format=fmt) | |
| logger.info("Created: {}".format(filename)) | |
| except Exception as e: | |
| logger.error("Error while exporting the song") | |
| logger.exception(e) | |
| def filter(self, low=None, high=None): | |
| """ This filters low and/or high frequencies. """ | |
| if self.__song is None: | |
| return | |
| if low is not None: | |
| logger.debug("Filtering low frequency...") | |
| self.__song = self.__song.low_pass_filter(low) | |
| if high is not None: | |
| logger.debug("Filtering high frequency...") | |
| self.__song = self.__song.high_pass_filter(high) | |
| def play(self): | |
| """ This plays the song. """ | |
| play(self.__song) | |
| def speedup(self, factor): | |
| """ This speeds up the song. """ | |
| if self.__song is None or factor == 1.0: | |
| return | |
| logger.debug("Changing playback speed...") | |
| self.__song = self.__song.speedup(playback_speed=factor) | |
| if __name__ == '__main__': | |
| parser.add_argument("items", nargs='+', | |
| help="folder with audio files or files themselves") | |
| parser.add_argument("-o", dest="output", default="audio.wav", | |
| help="output file") | |
| parser.add_argument("-q", dest="quiet", action="store_true", | |
| help="do not play the created audio") | |
| parser.add_argument("-s", dest="speedup", type=float, default=1.0, | |
| help="playback speed factor") | |
| parser.add_argument("--voice", action="store_true", | |
| help="filter voice frequency band") | |
| initialize() | |
| # running the main stuff | |
| s = Song() | |
| for i in args.items: | |
| p = Path(i) | |
| if p.is_dir(): | |
| for f in p.walk(): | |
| s.append(f) | |
| else: | |
| s.append(p) | |
| if args.voice: | |
| s.filter(300, 3000) | |
| s.speedup(args.speedup) | |
| s.export(args.output) | |
| if not args.quiet: | |
| s.play() |