Konuşma SDK'sı ile ses giriş cihazı seçme
Bu makalede, bir sisteme bağlı ses cihazlarının kimliklerinin nasıl alındığı açıklanır. Bu kimlikler daha sonra ses girişini seçmek için Konuşma SDK'sında kullanılabilir. Ses cihazını nesne aracılığıyla AudioConfig
yapılandırabilirsiniz:
audioConfig = AudioConfig.FromMicrophoneInput("<device id>");
audioConfig = AudioConfig.FromMicrophoneInput("<device id>");
audio_config = AudioConfig(device_name="<device id>");
audioConfig = AudioConfiguration.FromMicrophoneInput("<device id>");
audioConfig = AudioConfiguration.fromMicrophoneInput("<device id>");
audioConfig = AudioConfiguration.fromMicrophoneInput("<device id>");
Not
mikrofon kullanımı, Node.js çalışan JavaScript için kullanılamaz.
Masaüstü uygulamaları için Windows'ta ses cihazı kimlikleri
Ses cihazı uç nokta kimliği dizeleri , Masaüstü uygulamaları için Windows'taki nesneden IMMDevice
alınabilir.
Aşağıdaki kod örneği, C++'da ses cihazlarını listelemek için nasıl kullanılacağını gösterir:
#include <cstdio>
#include <mmdeviceapi.h>
#include <Functiondiscoverykeys_devpkey.h>
const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
constexpr auto REFTIMES_PER_SEC = (10000000 * 25);
constexpr auto REFTIMES_PER_MILLISEC = 10000;
#define EXIT_ON_ERROR(hres) \
if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk) \
if ((punk) != NULL) \
{ (punk)->Release(); (punk) = NULL; }
void ListEndpoints();
int main()
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
ListEndpoints();
}
//-----------------------------------------------------------
// This function enumerates all active (plugged in) audio
// rendering endpoint devices. It prints the friendly name
// and endpoint ID string of each endpoint device.
//-----------------------------------------------------------
void ListEndpoints()
{
HRESULT hr = S_OK;
IMMDeviceEnumerator *pEnumerator = NULL;
IMMDeviceCollection *pCollection = NULL;
IMMDevice *pEndpoint = NULL;
IPropertyStore *pProps = NULL;
LPWSTR pwszID = NULL;
hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator);
EXIT_ON_ERROR(hr);
hr = pEnumerator->EnumAudioEndpoints(eCapture, DEVICE_STATE_ACTIVE, &pCollection);
EXIT_ON_ERROR(hr);
UINT count;
hr = pCollection->GetCount(&count);
EXIT_ON_ERROR(hr);
if (count == 0)
{
printf("No endpoints found.\n");
}
// Each iteration prints the name of an endpoint device.
PROPVARIANT varName;
for (ULONG i = 0; i < count; i++)
{
// Get the pointer to endpoint number i.
hr = pCollection->Item(i, &pEndpoint);
EXIT_ON_ERROR(hr);
// Get the endpoint ID string.
hr = pEndpoint->GetId(&pwszID);
EXIT_ON_ERROR(hr);
hr = pEndpoint->OpenPropertyStore(
STGM_READ, &pProps);
EXIT_ON_ERROR(hr);
// Initialize the container for property value.
PropVariantInit(&varName);
// Get the endpoint's friendly-name property.
hr = pProps->GetValue(PKEY_Device_FriendlyName, &varName);
EXIT_ON_ERROR(hr);
// Print the endpoint friendly name and endpoint ID.
printf("Endpoint %d: \"%S\" (%S)\n", i, varName.pwszVal, pwszID);
CoTaskMemFree(pwszID);
pwszID = NULL;
PropVariantClear(&varName);
}
Exit:
CoTaskMemFree(pwszID);
pwszID = NULL;
PropVariantClear(&varName);
SAFE_RELEASE(pEnumerator);
SAFE_RELEASE(pCollection);
SAFE_RELEASE(pEndpoint);
SAFE_RELEASE(pProps);
}
C# dilinde NAudio kitaplığını kullanarak CoreAudio API'sine erişebilir ve cihazları aşağıdaki gibi numaralandırabilirsiniz:
using System;
using NAudio.CoreAudioApi;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var enumerator = new MMDeviceEnumerator();
foreach (var endpoint in
enumerator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active))
{
Console.WriteLine("{0} ({1})", endpoint.FriendlyName, endpoint.ID);
}
}
}
}
Örnek cihaz kimliği: {0.0.1.00000000}.{5f23ab69-6181-4f4a-81a4-45414013aac8}
.
UWP'de ses cihazı kimlikleri
Evrensel Windows Platformu (UWP) üzerinde, ilgili DeviceInformation
nesnenin Id()
özelliğini kullanarak ses giriş cihazları elde edebilirsiniz.
Aşağıdaki kod örnekleri, bu adımın C++ ve C# dilinde nasıl yapılacağını gösterir:
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Devices.Enumeration.h>
using namespace winrt::Windows::Devices::Enumeration;
void enumerateDeviceIds()
{
auto promise = DeviceInformation::FindAllAsync(DeviceClass::AudioCapture);
promise.Completed(
[](winrt::Windows::Foundation::IAsyncOperation<DeviceInformationCollection> const& sender,
winrt::Windows::Foundation::AsyncStatus /* asyncStatus */) {
auto info = sender.GetResults();
auto num_devices = info.Size();
for (const auto &device : info)
{
std::wstringstream ss{};
ss << "looking at device (of " << num_devices << "): " << device.Id().c_str() << "\n";
OutputDebugString(ss.str().c_str());
}
});
}
using Windows.Devices.Enumeration;
using System.Linq;
namespace helloworld {
private async void EnumerateDevices()
{
var devices = await DeviceInformation.FindAllAsync(DeviceClass.AudioCapture);
foreach (var device in devices)
{
Console.WriteLine($"{device.Name}, {device.Id}\n");
}
}
}
Örnek cihaz kimliği: \\\\?\\SWD#MMDEVAPI#{0.0.1.00000000}.{5f23ab69-6181-4f4a-81a4-45414013aac8}#{2eef81be-33fa-4800-9670-1cd474972c3f}
.
Linux'ta ses cihazı kimlikleri
Cihaz kimlikleri standart ALSA cihaz kimlikleri kullanılarak seçilir.
Sisteme eklenen girişlerin kimlikleri komutunun arecord -L
çıkışında yer alır.
Alternatif olarak, ALSA C kitaplığı kullanılarak elde edilebilirler.
Örnek kimlikler ve hw:CARD=CC,DEV=0
şeklindedirhw:1,0
.
macOS'ta ses cihazı kimlikleri
Objective-C'de uygulanan aşağıdaki işlev, Mac'e bağlı ses cihazlarının adlarının ve kimliklerinin listesini oluşturur.
dize, deviceUID
macOS için Konuşma SDK'sında bir cihazı tanımlamak için kullanılır.
#import <Foundation/Foundation.h>
#import <CoreAudio/CoreAudio.h>
CFArrayRef CreateInputDeviceArray()
{
AudioObjectPropertyAddress propertyAddress = {
kAudioHardwarePropertyDevices,
kAudioObjectPropertyScopeGlobal,
kAudioObjectPropertyElementMaster
};
UInt32 dataSize = 0;
OSStatus status = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize);
if (kAudioHardwareNoError != status) {
fprintf(stderr, "AudioObjectGetPropertyDataSize (kAudioHardwarePropertyDevices) failed: %i\n", status);
return NULL;
}
UInt32 deviceCount = (uint32)(dataSize / sizeof(AudioDeviceID));
AudioDeviceID *audioDevices = (AudioDeviceID *)(malloc(dataSize));
if (NULL == audioDevices) {
fputs("Unable to allocate memory", stderr);
return NULL;
}
status = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize, audioDevices);
if (kAudioHardwareNoError != status) {
fprintf(stderr, "AudioObjectGetPropertyData (kAudioHardwarePropertyDevices) failed: %i\n", status);
free(audioDevices);
audioDevices = NULL;
return NULL;
}
CFMutableArrayRef inputDeviceArray = CFArrayCreateMutable(kCFAllocatorDefault, deviceCount, &kCFTypeArrayCallBacks);
if (NULL == inputDeviceArray) {
fputs("CFArrayCreateMutable failed", stderr);
free(audioDevices);
audioDevices = NULL;
return NULL;
}
// Iterate through all the devices and determine which are input-capable
propertyAddress.mScope = kAudioDevicePropertyScopeInput;
for (UInt32 i = 0; i < deviceCount; ++i) {
// Query device UID
CFStringRef deviceUID = NULL;
dataSize = sizeof(deviceUID);
propertyAddress.mSelector = kAudioDevicePropertyDeviceUID;
status = AudioObjectGetPropertyData(audioDevices[i], &propertyAddress, 0, NULL, &dataSize, &deviceUID);
if (kAudioHardwareNoError != status) {
fprintf(stderr, "AudioObjectGetPropertyData (kAudioDevicePropertyDeviceUID) failed: %i\n", status);
continue;
}
// Query device name
CFStringRef deviceName = NULL;
dataSize = sizeof(deviceName);
propertyAddress.mSelector = kAudioDevicePropertyDeviceNameCFString;
status = AudioObjectGetPropertyData(audioDevices[i], &propertyAddress, 0, NULL, &dataSize, &deviceName);
if (kAudioHardwareNoError != status) {
fprintf(stderr, "AudioObjectGetPropertyData (kAudioDevicePropertyDeviceNameCFString) failed: %i\n", status);
continue;
}
// Determine if the device is an input device (it is an input device if it has input channels)
dataSize = 0;
propertyAddress.mSelector = kAudioDevicePropertyStreamConfiguration;
status = AudioObjectGetPropertyDataSize(audioDevices[i], &propertyAddress, 0, NULL, &dataSize);
if (kAudioHardwareNoError != status) {
fprintf(stderr, "AudioObjectGetPropertyDataSize (kAudioDevicePropertyStreamConfiguration) failed: %i\n", status);
continue;
}
AudioBufferList *bufferList = (AudioBufferList *)(malloc(dataSize));
if (NULL == bufferList) {
fputs("Unable to allocate memory", stderr);
break;
}
status = AudioObjectGetPropertyData(audioDevices[i], &propertyAddress, 0, NULL, &dataSize, bufferList);
if (kAudioHardwareNoError != status || 0 == bufferList->mNumberBuffers) {
if (kAudioHardwareNoError != status)
fprintf(stderr, "AudioObjectGetPropertyData (kAudioDevicePropertyStreamConfiguration) failed: %i\n", status);
free(bufferList);
bufferList = NULL;
continue;
}
free(bufferList);
bufferList = NULL;
// Add a dictionary for this device to the array of input devices
CFStringRef keys [] = { CFSTR("deviceUID"), CFSTR("deviceName")};
CFStringRef values [] = { deviceUID, deviceName};
CFDictionaryRef deviceDictionary = CFDictionaryCreate(kCFAllocatorDefault,
(const void **)(keys),
(const void **)(values),
2,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFArrayAppendValue(inputDeviceArray, deviceDictionary);
CFRelease(deviceDictionary);
deviceDictionary = NULL;
}
free(audioDevices);
audioDevices = NULL;
// Return a non-mutable copy of the array
CFArrayRef immutableInputDeviceArray = CFArrayCreateCopy(kCFAllocatorDefault, inputDeviceArray);
CFRelease(inputDeviceArray);
inputDeviceArray = NULL;
return immutableInputDeviceArray;
}
Örneğin, yerleşik mikrofon için UID şeklindedir BuiltInMicrophoneDevice
.
iOS'ta ses cihazı kimlikleri
Konuşma SDK'sı ile ses cihazı seçimi iOS'ta desteklenmez. SDK kullanan uygulamalar, Çerçeve üzerinden ses yönlendirmeyi AVAudioSession
etkileyebilir.
Örneğin, yönerge
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord
withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:NULL];
Konuşma özellikli bir uygulama için Bluetooth mikrofonlu kulaklığının kullanılmasını sağlar.
JavaScript'te ses cihazı kimlikleri
JavaScript'te MediaDevices.enumerateDevices() yöntemi, medya cihazlarını listelemek ve öğesine geçirilecek cihaz kimliğini bulmak için fromMicrophone(...)
kullanılabilir.
Sonraki adımlar
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin