Monthly Archives: Август 2015

Набор методов для маршалинга и анмаршалинга

При создании и обращении к веб-сервисам в большинстве случаем мы можем забыть и не знать о маршалинге и анмаршалинге (демаршалинге). Но бывают интеграции, где каким-то текстовым полем передается XML-ка. Вот тут нужно с одной стороны уметь делать маршалинг, а с другой анмаршалинг. Предлагаю набор методов для проведения данных операций:

import javax.xml.bind.*;
import java.io.File;
import java.io.StringReader;
import java.io.StringWriter;
 
/**
 * Набор методов для маршалинга и анмаршалинга
 */
public class XmlUtils {
 
	/**
	 * Маршалинг в строку
	 * @param t объект
	 * @param <T> тип объекта
	 * @return XML в виде строки
	 * @throws JAXBException
	 */
	public static<T> String marshalRoot(T t) throws JAXBException {
		JAXBContext context = JAXBContext.newInstance(t.getClass());
		Marshaller marshaller = context.createMarshaller();
		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
		marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
		StringWriter sw = new StringWriter();
		marshaller.marshal(t,sw);
		return sw.toString();
	}
 
	/**
	 * Маршалинг в файл
	 * @param t объект
	 * @param file файл
	 */
	public static<T> void marshalRoot(T t,File file){
		marshal(t,file,false);
	}
 
	/**
	 * Маршалинг в файл с возможностью вывода в консоль
	 * @param t объект
	 * @param file файл
	 * @param isAddToLog делать вывод в консоль или нет
	 */
	public static<T> void marshal(T t,File file,boolean isAddToLog){
		String filePath = file.getAbsolutePath();
		try {
			JAXBContext jaxbContext = JAXBContext.newInstance(t.getClass());
			Marshaller marshaller = jaxbContext.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
			marshaller.marshal(t,file);
			if(isAddToLog){
				marshaller.marshal(t,System.out);
			}
		} catch (JAXBException e) {
			System.out.println("Не удалось сбросить xml в файл: " + filePath);
			e.printStackTrace();
		}
		System.out.println("Xml saved to: " + filePath);
	}
 
	/**
	 * Анмаршалинг (Демаршалинг) XML в объект
	 * @param xml входной XML
	 * @param _class класс объекта, который ходит получить
	 * @return объект
	 * @throws JAXBException
	 */
	@SuppressWarnings("unchecked")
	public static <T> T unmarshall(String xml,Class<T> _class) throws JAXBException {
		JAXBContext context = JAXBContext.newInstance(_class);
		Unmarshaller unmarshaller = context.createUnmarshaller();
		JAXBElement<T> element = (JAXBElement<T>)unmarshaller.unmarshal(new StringReader(xml));
		return element.getValue();
	}
 
	/**
	 * Анмаршалинг XML root-элемента (@XmlRootElement) в объект
	 * @param xml входной XML
	 * @param _class класс объекта, который ходит получить
	 * @return объект
	 * @throws JAXBException
	 */
	@SuppressWarnings("unchecked")
	public static <T> T unmarshallRoot(String xml,Class<T> _class) throws JAXBException{
		JAXBContext context = JAXBContext.newInstance(_class);
		Unmarshaller unmarshaller = context.createUnmarshaller();
		return (T)unmarshaller.unmarshal(new StringReader(xml));
	}
 
 
}

Разрезка аудио по тишине с помощью Audacity

У меня был несжатый звуковой файл в формате wav, в котором были записаны слова и словосочетания, озвученные диктором. Между словами и словосочетаниями была выдержана пауза, которая была больше паузы между словами в словосочетаниях. Слов было порядка тысячи. И в итоге мне нужно было получить тысячу сжатых файлов в формате mp3.
Программа Audacity выполнила эту задачу очень хорошо.

  1. Откройте звуковой файл с помощью программы Audacity:
    01
    На рисунке видны ярко выраженные паузы.

  2. Теперь выделим все фрагменты аудиозаписи, разделенные тишиной. Для этого в меню Анализ выберите пункт Sound Finder …
    02 анализ
    03 sound finder

  3. Далее появиться окно настройки параметров. По умолчанию минимальная продолжительность тишины между звуками — 1 секунда. В моем же случае понадобилось уменьшить этот параметр до 0,4 секунды, т.е. в этом окне можно поиграться с параметрами:
    04 duration

  4. После указания параметров и нажатия кнопки OK, все искомые фрагменты будут выделены:
    05 selection

  5. Следующая задача — это экспорт этих фрагментов в mp3-файлы, делается это через меню Файл:
    06 file
    Выберите в нем пункт Экспортировать в несколько файлов…:
    07 export

  6. Выберите формат экспорта mp3 (или любой доступный), укажите каталог экспорта и нажмите Экспорт:
    08 export dir

  7. Далее нужно будет заполнить метаданные, которые являются необязательными, для каждого файла:
    09 meta
    К сожалению, у меня не получилось сделать эту операцию скопом 😕
    p.s. Я не поленился и нажал кнопку ОК для каждого файла, а их было около 1000.
    Зато в итоге я получил качественно разбитые записи.