现在的位置: 首页 > 综合 > 正文

使用 sndpeek 识别说话者

2013年02月10日 ⁄ 综合 ⁄ 共 1630字 ⁄ 字号 评论关闭

使用 sndpeek 和自定义算法在预先录制的库中寻找匹配的语音。创建应用程序帮助您识别电话会议、podcast 和新闻直播中的说话者。构建基本的辅助程序以帮助有听力障碍的人士在带宽有限的环境中识别说话者。

通过声波纹实现 可靠的身份验证十分复杂和困难。但是,sndpeek 和一些自定义算法可以提供一种声波纹匹配配置,这种配置适当降低了复杂度,同时保留了较高程度的有效性。本文将演示修改 sndpeek 所需的工具和代码,从而针对给定讲话者录制个人声波纹文件。随后将把所有这些文件与传入的实时音频流相比较,从而提供当前说话者的最佳猜测匹配和可视化。

要求

硬件

需 要系统能够处理可能来自外部麦克风的声音输入。本文中的代码是在支持 1,800-MHz 处理器和 1 GB RAM 的 IBM® ThinkPad T42p 上开发和测试的。性能稍差一些的系统应当能够使用本文提供的代码,因为 sndpeek 是主要的资源消耗者并且是一个高效的程序。

软件

需 要可支持声音处理和麦克风的操作系统,Mac OS X、Windows® 和 Linux® 的当前版本都可以。虽然声音配置和故障排除超出了本文的范围,但是在 Vector Linux Live CD 上测试这段代码可能十分有用,因为 Vector Linux Live CD 拥有在各种声音硬件上实现有效设置所需的大部分驱动程序和组件。还需要用于显示的硬件 3-D 加速功能。

sndpeek 应用程序(请参阅 参考资料)被设计为在 Windows、Mac OS X 和 Linux 上工作。在继续处理本文所述的修改之前,请确保拥有运行正常的音频环境。



回页首

构建用于匹配的声音文件库

语音参考文件要求

为了精确匹配语音,要求具有可以与当前声音相比较的内容。需要有持续时间较长的声音示例,从而以此作为匹配对象创建可靠的模板。示例长度最好为 5 分钟左右的普通讲话,包括沉默、单词之间的停顿等。

应当避免混入很多其他交谈特性,例如咳嗽、键盘噼啪响声以及过度的电话线或环境噪声。需要使用噪声相对较小的环境,因为声音表达以外的任何声音都会对参考声波纹产生不利影响。

需 要使用您最喜爱的音频编辑程序(例如 Audacity)把可用的已录制语音材料连接成单语音(single-voice)音频文件。例如,我使用了录制的电话会议和 IBM developerWorks podcast 作为撰写这篇文章时使用的单语音音频文件的原始材料。

注意,您可能需要更多或非常少的源数据,这取决于要匹配的说话者的自身差异。考虑图 1 和一小部分语音之间的平均差异。该图形是使用另一个优秀的音频处理工具 baudline 实时生成的。

图 1. 使用 baudline 得到的平均语音波形示例
使用 baudline 得到的平均语音波形示例

修改 sndpeek

下载并解压缩 sndpeek 源代码(请参阅 参考资料)。构建平均声波纹的频谱组件要求修改 sndpeek.cpp 文件。首先在第 284 行开始添加一些库包含(include)语句和变量声明。

清单 1. 库包含语句、变量声明

                
// for reading *.vertex* entries in the current directory
#include <dirent.h>

// voice matching function prototypes
void initialize_vertices( );
void build_match_number( int voices_index );

// for voiceprint matching
int g_voice_spectrum[200]; // human voice useful data in 0-199 range
int g_total_sample_size = 0; // current size, or number of data points
float g_loudness_threshold = -0.8; // what is a loud enough sample

接下来,在第 1339 开始添加如下所示的代码以开始监视过程。

 

本文转自IBM Developerworks中国

        请点击此处查看全文

抱歉!评论已关闭.