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  тип объекта
	 * @return XML в виде строки
	 * @throws JAXBException
	 */
	public static 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 void marshalRoot(T t,File file){
		marshal(t,file,false);
	}

	/**
	 * Маршалинг в файл с возможностью вывода в консоль
	 * @param t объект
	 * @param file файл
	 * @param isAddToLog делать вывод в консоль или нет
	 */
	public static 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 unmarshall(String xml,Class _class) throws JAXBException {
		JAXBContext context = JAXBContext.newInstance(_class);
		Unmarshaller unmarshaller = context.createUnmarshaller();
		JAXBElement element = (JAXBElement)unmarshaller.unmarshal(new StringReader(xml));
		return element.getValue();
	}

	/**
	 * Анмаршалинг XML root-элемента (@XmlRootElement) в объект
	 * @param xml входной XML
	 * @param _class класс объекта, который ходит получить
	 * @return объект
	 * @throws JAXBException
	 */
	@SuppressWarnings("unchecked")
	public static  T unmarshallRoot(String xml,Class _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. Зато в итоге я получил качественно разбитые записи.