[PYTHON] Extrayez les informations de paroles dans le fichier MP3 / MP4 et enregistrez-les dans le fichier de paroles (* .lrc) pour Sony Walkman.

Contexte

Je suis passé d'iPod à Walkman Sony il y a quelques années. Avec le baladeur, vous pouvez afficher les paroles et en entrant les informations de temps sur chaque ligne des paroles, il défilera en fonction de la chanson ou de la conversation en anglais. C'est très pratique pour pratiquer le chant et apprendre la conversation en anglais. Cependant, les paroles du fichier MP3 / MP4 ne sont pas affichées et le texte des paroles doit être sauvegardé dans le fichier LRC dédié aux paroles.

Auparavant, avec le logiciel "Media Go" fourni par Sony, vous pouviez lire des chansons enregistrées dans iTunes pour iPod, les transférer sur le baladeur, ouvrir les propriétés de chaque chanson dans iTunes et copier le texte des paroles. Ensuite, je l'ai collé sur le côté Media Go et édité l'heure des paroles. Ce processus de transfert est devenu fastidieux et j'ai créé un script Python qui extrait le texte des paroles du fichier MP3 / MP4 et l'enregistre dans le fichier LRC. Vous pouvez simplement afficher les paroles ou spécifier un répertoire pour créer des fichiers LRC pour tous les fichiers à la fois.

Environnement d'exploitation

Nécessite Python3 et un module mutagène. Je l'utilise dans un environnement Windows, les chansons japonaises ont de nombreux noms de fichiers japonais et j'avais besoin de Python3 pour bien gérer le japonais. J'ai également installé et utilisé le module mutagen avec pip pour lire les informations sur les paroles de MP3 / MP4.

Installation du module mutagène

$ pip3 install mutagen
Ou
$ python3 -m pip install mutagen
Ou
$ sudo python3 -m pip install mutagen

Comment utiliser

Affichage de l'aide (aide)

$ lyrics.py -h
usage: lyrics.py [-h] [-l] [-s] [-c] [-r] file [file ...]

positional arguments:
  file           file or directory name

optional arguments:
  -h, --help     show this help message and exit
  -l, --list     show file names containing lyrics (default)
  -s, --show     show lyrics
  -c, --create   create "*.lrc" lyrics files if it does not exist
  -r, --replace  create or replace "*.lrc" lyrics files

Liste des noms de fichiers avec informations sur les paroles (liste)

$ lyrics.py -l .

Afficher les paroles

$ lyrics.py -s "1-01 Just The Way You Are.mp3"
$ lyrics.py -s "Billy Joel"

Enregistrer dans un fichier LRC (créer: uniquement s'il n'existe pas)

$ lyrics.py -c "Billy Joel"

Enregistrer dans un fichier LRC (remplacer: écraser si existant, noter que les informations de temps seront perdues)

$ lyrics.py -r "Billy Joel"

Code source

github

https://github.com/shiracamus/lyrics_converter

Script Python

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
#
# Lyrics converter
#
# version: 2017.4.18
# author: @shiracamus
# github: https://github.com/shiracamus/lyrics_converter
#
# Need to install mutagen module
#     $ python3 -m pip install mutagen
# or
#     $ sudo python3 -m pip install mutagen
#

import os
import sys
import argparse
from mutagen.id3 import ID3, ID3NoHeaderError
from mutagen.mp4 import MP4, MP4StreamInfoError


def read_lyrics_in_mp3(path):
    try:
        tags = ID3(path)
        for key in tags:
            if key.startswith('USLT'):
                return tags[key].text
    except ID3NoHeaderError:
        pass
    return None


def read_lyrics_in_mp4(path):
    try:
        tags = MP4(path).tags
        if '\xa9lyr' in tags:
            return tags['\xa9lyr'][0]
    except MP4StreamInfoError:
        pass
    return None


def read_lyrics(path):
    return (read_lyrics_in_mp3(path) or
            read_lyrics_in_mp4(path) or
            None)


class Lyrics:

    def __init__(self, path):
        self.path = path
        self.path_base, self.path_ext = os.path.splitext(path)
        self.text = read_lyrics(path)
        self.exists = bool(self.text)

    def __repr__(self):
        return '<base="%s", ext="%s", lyrics=%s>' % (self.path_base,
                                                     self.path_ext,
                                                     self.exists)


class LRC:
    ext = '.lrc'

    def __init__(self, path):
        self.path = path
        self.exists = os.path.exists(self.path)

    def save(self, text):
        with open(self.path, 'w') as f:
            f.write(text)
        self.exists = True


def show_filename(lyrics):
    print(lyrics.path)


def show_lyrics(lyrics):
    print('=' * 30)
    print(lyrics.path)
    print('-' * 30)
    print(lyrics.text)
    print()


def save_lrc(lyrics, replace=False):
    lrc = LRC(lyrics.path_base + LRC.ext)
    if not lrc.exists or replace:
        lrc.save(lyrics.text)
        print('Saved "%s"' % lrc.path)
    else:
        print('Already exists "%s"' % lrc.path)


def pathes(files_and_directories):
    for file_or_directory in files_and_directories:
        if os.path.isfile(file_or_directory):
            yield file_or_directory
        elif os.path.isdir(file_or_directory):
            for root, dirs, files in os.walk(file_or_directory):
                for filename in files:
                    yield os.path.join(root, filename)


def parse_args():
    p = argparse.ArgumentParser()
    p.add_argument('-l', '--list', action='store_true',
                   help='show file names containing lyrics (default)')
    p.add_argument('-s', '--show', action='store_true',
                   help='show lyrics')
    p.add_argument('-c', '--create', action='store_true',
                   help='create "*.lrc" lyrics files if it does not exist')
    p.add_argument('-r', '--replace', action='store_true',
                   help='create or replace "*.lrc" lyrics files')
    p.add_argument('file', nargs='+', default='.',
                   help='file or directory name')
    args = p.parse_args()
    if not (args.show or args.create or args.replace):
        args.list = True
    return args


def main(args):
    for path in pathes(args.file):
        lyrics = Lyrics(path)
        if not lyrics.text:
            continue
        if args.list:
            show_filename(lyrics)
        if args.show:
            show_lyrics(lyrics)
        if args.create or args.replace:
            save_lrc(lyrics, replace=args.replace)

if __name__ == '__main__':
    main(parse_args())

à partir de maintenant

Les commentaires dans la source seront ajoutés séquentiellement. Je veux pouvoir gérer des fichiers autres que MP3 / MP4, alors faites-le moi savoir si vous connaissez la méthode de traitement. Je veux aussi créer un wrapper GUI. Ce serait formidable si les informations temporelles pouvaient être créées automatiquement, mais il n'y a toujours pas de bibliothèque qui reconnaît la voix des chansons et crée des paroles, non?

Recommended Posts

Extrayez les informations de paroles dans le fichier MP3 / MP4 et enregistrez-les dans le fichier de paroles (* .lrc) pour Sony Walkman.
Comment enregistrer les informations de point caractéristique de l'image dans un fichier et l'utiliser pour la mise en correspondance
Lisez le fichier csv et affichez-le dans le navigateur
Enregistrez le modèle pystan et les résultats dans un fichier pickle
Enregistrez le fichier binaire en Python
Celui qui divise le fichier csv, le lit et le traite en parallèle
Extraire des informations à l'aide de File :: Stat dans Ruby
Trouvez-le dans la file d'attente et modifiez-le
Enregistrez l'ID de canal spécifié dans le texte et chargez-le au prochain démarrage
Extraire uniquement le nom du fichier à l'exclusion du répertoire dans le répertoire
12. Enregistrez la première colonne dans col1.txt et la deuxième colonne dans col2.txt
Dans bash, "supprimez le fichier s'il existe".
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
Extraire et lister les noms des personnes et des lieux dans le texte
Sélectionnez les variables requises dans TensorFlow et enregistrez / restaurez
Extraire uniquement le son d'un instrument spécifique du fichier MIDI et en faire un fichier séparé
Analysez l'API Researchmap avec Python et créez automatiquement un fichier Word pour la liste des succès