Разработка приложений Ingenic T31 3 аудиовхода
Разработка приложений Ingenic T31 3 аудиовхода

1. Функции, поддерживаемые аудиочипом T31

Аудио функции включают в себяАудиовход, аудиовыход, эхоподавление, кодирование звука и декодирование звука 5 модуль.

Существуют понятия устройств и каналов аудиовхода и аудиовыхода. Один микрофон считается устройством, и микрофон может иметь несколько входов каналов. Один и тот же SPK считается устройством воспроизведения, и SPK также может иметь несколько выходов каналов. Текущая версия аудио API поддерживает только один канал для каждого устройства. (T31 имеет только один вход и один выход)

Эхоподавление находится в интерфейсе аудиовхода, а конкретные инструкции отражены в описании функции.

2. Основные аудиоформаты и аудиоформаты, поддерживаемые T31.

2.1. Основные аудиоформаты: (Аудиоформаты, обычно используемые в аудио и видео).

PCM:Необработанный поток аудиоданных, исходящий из большинства чипов。

G711A&G711U:

G711 — это набор стандартов сжатия голоса, разработанный Международным союзом электросвязи ITU-T. Он представляет собой стандарт логарифмической выборки PCM (логарифмическая импульсно-кодовая модуляция) и в основном используется для телефонов. В основном он использует импульсно-кодовую модуляцию для выборки звука с частотой дискретизации 8k в секунду. Для передачи голосовых сигналов он использует несжатый канал со скоростью 64 Кбит/с. Начальная степень сжатия составляет 1:2, то есть 16-битные данные сжимаются в 8 бит. G.711 — это основной кодек звукового сигнала.

В стандарте G.711 существует два основных алгоритма сжатия. Один из них — алгоритм u-law (также известный как u-law, ulaw, mu-law), который в основном используется в Северной Америке и Японии, другой — алгоритм A-law, который в основном используется в Европе и других частях страны; мир. Среди них последний специально разработан для облегчения компьютерной обработки.

Содержимое G711 предназначено для кодирования 14-битных (uLaw) или 13-битных (aLaw) дискретизированных данных PCM в 8-битный поток данных. Во время воспроизведения 8-битные данные восстанавливаются до 14-битных или 13-битных данных для воспроизведения. В отличие от MPEG, который не обрабатывает общий или 13-битный формат. Фрагмент данных рассматривается перед кодированием и декодированием G711 — это алгоритм кодирования и декодирования формы сигнала, то есть одна выборка соответствует одному кодированию, поэтому степень сжатия фиксируется как:

8/14 = 57% (uLaw)

8/13 = 62% (aLaw) Просто поймите, G.711 - это нелинейное квантование голосовых аналоговых сигналов, битрейт 64кбит/с.

AAC:

AAC, полное название Advanced Audio Coding, китайское название: Advanced Audio Coding, представляет собой формат сжатия файлов, специально разработанный для звуковых данных. В отличие от MP3, он использует новый алгоритм кодирования, который более эффективен и имеет более высокую «экономичность». Использование формата AAC может заставить людей почувствовать, что качество звука существенно не снижается и он становится более компактным. Мобильные телефоны Apple iPod и Nokia поддерживают аудиофайлы в формате AAC.

2.2.Аудиоформаты, поддерживаемые в настоящее время T31

Кодирование звука. Текущий API аудио поддерживает кодирование звука в форматах PT_G711A, PT_G711U и PT_G726.

Если вам нужно добавить новый метод кодирования, вам необходимо зарегистрировать кодировщик.

Декодирование звука. Текущий API-интерфейс аудио поддерживает декодирование звука в форматах PT_G711A, PT_G711U и PT_G726.

Если вам нужно добавить новый метод декодирования, вам необходимо зарегистрировать декодер.

3. Блок-схема структуры кода

Ниже мы рисуем блок-схему работы системы: Схема процесса сбора аудио.

Под MIC подразумевается микрофон, который используется для сбора внешних звуков, сбора аналоговых сигналов, преобразования их в цифровые сигналы через чип T31 и последующего сохранения их в файлы определенного формата.

4. Кодексная практика

Ingenic T31SDK предоставляет пример кода о том, как получить необработанные аудиоданные из чипа T31 и сохранить их во флэш-памяти.

В нем есть несколько функций, которые необходимо объяснить:

4.1: Создать тему

_ai_basic_record_test_thread:Все наши операции выполняются в этом потоке,Вы можете понимать это как задачу.

4.2: Настройка свойств устройства ввода звука

IMP_AI_SetPubAttr:

Язык кода:javascript
копировать
	int devID = 1;                                           //devID:0: цифровой микрофон, 1: представляет аналоговый микрофон
	IMPAudioIOAttr attr;
	attr.samplerate = AUDIO_SAMPLE_RATE_16000;               //Частота дискретизации звука 16000
	attr.bitwidth = AUDIO_BIT_WIDTH_16;                      //Точность дискретизации звука 16 бит
	attr.soundmode = AUDIO_SOUND_MODE_MONO;                  //Применить монорежим
	attr.frmNum = 40;                                        //Количество буферизованных кадров 
	attr.numPerFrm = 640;                                    //Количество точек выборки на кадр
	attr.chnCnt = 1;                                         //Количество поддерживаемых каналов
	ret = IMP_AI_SetPubAttr(devID, &attr);

4.3: Получение исходных данных кадра аудио

Язык кода:javascript
копировать
		/* Step 6: get audio record frame. */
		/*Используйте этот интерфейс перед использованием IMP_AI_GetFrame. При успешном вызове интерфейса отображается аудио.
 		  Данные подготовлены, и вы можете использовать IMP_AI_GetFrame для получения аудиоданных*/
		ret = IMP_AI_PollingFrame(devID, chnID, 1000);
		if (ret != 0 ) {
			IMP_LOG_ERR(TAG, "Audio Polling Frame Data error\n");
		}
		/* 
		* @param[in] audioDevId Номер аудиоустройства.
 		* @param[in] aiChn Номер входного аудиоканала.
 		* @param[out] frm Указатель структуры аудиокадра.
 		* @param[in] block Флаг блокировки/неблокировки.
 		*/
		IMPAudioFrame frm;
		ret = IMP_AI_GetFrame(devID, chnID, &frm, BLOCK);
		if(ret != 0) {
			IMP_LOG_ERR(TAG, "Audio Get Frame Data error\n");
			return NULL;
		}
		/* Step 8: release the audio record frame. */
		ret = IMP_AI_ReleaseFrame(devID, chnID, &frm);
		if(ret != 0) {
			IMP_LOG_ERR(TAG, "Audio release frame data error\n");
			return NULL;
		}

4.4: ДЕМО-программа оригинального SDK Junzheng

Язык кода:javascript
копировать
/*
 * Ingenic IMP AI implement.
 *
 * Copyright (C) 2017 Ingenic Semiconductor Co.,Ltd
 *
 */

#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/prctl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
#include <errno.h>
#include <pthread.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/time.h>

#include <imp/imp_audio.h>
#include <imp/imp_log.h>
#define TAG "Sample-AI"


#define AI_BASIC_TEST_RECORD_FILE "ai_lbb.pcm"
#define AI_BASIC_TEST_RECORD_NUM 600

static void *_ai_basic_record_test_thread(void *argv)
{
	int ret = -1;
	int record_num = 0;

	FILE *record_file = fopen(AI_BASIC_TEST_RECORD_FILE, "wb");
	if(record_file == NULL) {
		IMP_LOG_ERR(TAG, "fopen %s failed\n", AI_BASIC_TEST_RECORD_FILE);
		return NULL;
	}

	/* Step 1: set public attribute of AI device. */
	int devID = 1;
	IMPAudioIOAttr attr;
	attr.samplerate = AUDIO_SAMPLE_RATE_16000;
	attr.bitwidth = AUDIO_BIT_WIDTH_16;
	attr.soundmode = AUDIO_SOUND_MODE_MONO;
	attr.frmNum = 40;
	attr.numPerFrm = 640;
	attr.chnCnt = 1;
	ret = IMP_AI_SetPubAttr(devID, &attr);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "set ai %d attr err: %d\n", devID, ret);
		return NULL;
	}

	memset(&attr, 0x0, sizeof(attr));
	ret = IMP_AI_GetPubAttr(devID, &attr);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "get ai %d attr err: %d\n", devID, ret);
		return NULL;
	}

	IMP_LOG_INFO(TAG, "Audio In GetPubAttr samplerate : %d\n", attr.samplerate);
	IMP_LOG_INFO(TAG, "Audio In GetPubAttr   bitwidth : %d\n", attr.bitwidth);
	IMP_LOG_INFO(TAG, "Audio In GetPubAttr  soundmode : %d\n", attr.soundmode);
	IMP_LOG_INFO(TAG, "Audio In GetPubAttr     frmNum : %d\n", attr.frmNum);
	IMP_LOG_INFO(TAG, "Audio In GetPubAttr  numPerFrm : %d\n", attr.numPerFrm);
	IMP_LOG_INFO(TAG, "Audio In GetPubAttr     chnCnt : %d\n", attr.chnCnt);

	/* Step 2: enable AI device. */
	ret = IMP_AI_Enable(devID);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "enable ai %d err\n", devID);
		return NULL;
	}

	/* Step 3: set audio channel attribute of AI device. */
	int chnID = 0;
	IMPAudioIChnParam chnParam;
	chnParam.usrFrmDepth = 40;
	ret = IMP_AI_SetChnParam(devID, chnID, &chnParam);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "set ai %d channel %d attr err: %d\n", devID, chnID, ret);
		return NULL;
	}

	memset(&chnParam, 0x0, sizeof(chnParam));
	ret = IMP_AI_GetChnParam(devID, chnID, &chnParam);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "get ai %d channel %d attr err: %d\n", devID, chnID, ret);
		return NULL;
	}

	IMP_LOG_INFO(TAG, "Audio In GetChnParam usrFrmDepth : %d\n", chnParam.usrFrmDepth);

	/* Step 4: enable AI channel. */
	ret = IMP_AI_EnableChn(devID, chnID);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "Audio Record enable channel failed\n");
		return NULL;
	}

	/* Step 5: Set audio channel volume. */
	int chnVol = 60;
	ret = IMP_AI_SetVol(devID, chnID, chnVol);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "Audio Record set volume failed\n");
		return NULL;
	}

	ret = IMP_AI_GetVol(devID, chnID, &chnVol);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "Audio Record get volume failed\n");
		return NULL;
	}
	IMP_LOG_INFO(TAG, "Audio In GetVol    vol : %d\n", chnVol);

	int aigain = 28;
	ret = IMP_AI_SetGain(devID, chnID, aigain);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "Audio Record Set Gain failed\n");
		return NULL;
	}

	ret = IMP_AI_GetGain(devID, chnID, &aigain);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "Audio Record Get Gain failed\n");
		return NULL;
	}
	IMP_LOG_INFO(TAG, "Audio In GetGain    gain : %d\n", aigain);

	while(1) {
		/* Step 6: get audio record frame. */

		ret = IMP_AI_PollingFrame(devID, chnID, 1000);
		if (ret != 0 ) {
			IMP_LOG_ERR(TAG, "Audio Polling Frame Data error\n");
		}
		IMPAudioFrame frm;
		ret = IMP_AI_GetFrame(devID, chnID, &frm, BLOCK);
		if(ret != 0) {
			IMP_LOG_ERR(TAG, "Audio Get Frame Data error\n");
			return NULL;
		}
		
		printf("seq = %d,timeStamp = %lld\n",frm.seq,frm.timeStamp);
		
		/* Step 7: Save the recording data to a file. */
		fwrite(frm.virAddr, 1, frm.len, record_file);

		/* Step 8: release the audio record frame. */
		ret = IMP_AI_ReleaseFrame(devID, chnID, &frm);
		if(ret != 0) {
			IMP_LOG_ERR(TAG, "Audio release frame data error\n");
			return NULL;
		}

		if(++record_num >= AI_BASIC_TEST_RECORD_NUM)
			break;
	}
	sleep(3);
	/* Step 9: disable the audio channel. */
	ret = IMP_AI_DisableChn(devID, chnID);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "Audio channel disable error\n");
		return NULL;
	}

	/* Step 10: disable the audio devices. */
	ret = IMP_AI_Disable(devID);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "Audio device disable error\n");
		return NULL;
	}

	fclose(record_file);
	pthread_exit(0);
}

int main(void)
{
	int ret = -1;
	pthread_t record_thread_id;
	printf("[INFO] Test 1: Start audio record test.\n");
	printf("[INFO]        : Can create the %s file.\n", AI_BASIC_TEST_RECORD_FILE);
	printf("[INFO]        : Please input any key to continue.\n");
	getchar();

	/* Step 1: Start audio recording thread. */
	ret = pthread_create(&record_thread_id, NULL, _ai_basic_record_test_thread, NULL);
	if(ret != 0) {
		IMP_LOG_ERR(TAG, "[ERROR] %s: pthread_create Audio Record failed\n", __func__);
		return -1;
	}
	pthread_join(record_thread_id, NULL);
	return 0;
}
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose